系统调用方式文件编程.docx
- 文档编号:3960711
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:13
- 大小:17.49KB
系统调用方式文件编程.docx
《系统调用方式文件编程.docx》由会员分享,可在线阅读,更多相关《系统调用方式文件编程.docx(13页珍藏版)》请在冰豆网上搜索。
系统调用方式文件编程
Linux文件编程函数
一简述几个基本知识——
1Linux应用程序编程所用到的函数,主要有两种方式提供:
系统调用方式函数库方式
2如何学习这些函数?
三步学习法:
第一步:
借助工具书,查找函数名;《Unix环境高级编程》
第二步:
在Linux系统中,利用man命令查看函数信息,并填写函数学习手册。
第三步:
实践,编写代码。
3VI概念——文件描述符
性质:
一个数字
特别含义:
其功能类似于身份证号码,通过身份证号码,可以将对应的公民;在Linux系统中,每一个打开的文件,都对应一个数字,通过这个唯一的数字,可以找到这个打开的文件,并对其进行操作,比如读、写等。
二首先学习系统调用方式提供的函数——
4学习以下7个函数——
打开文件创建文件关闭文件读文件写文件文件定位
复制文件描述符
5打开文件——open
范例1:
打开已经存的文件open.c
#include
#include
#include
voidmain()
{
intfd;/*文件描述符*/
fd=open("/home/test.c",O_RDWR);
if(fd<0)
printf("Openfilefali!
\n");
else
printf("Openfilesucessfully!
\n");
}
范例2:
利用open函数创建新文件open_creat.c
#include
#include
#include
voidmain()
{
intfd;/*文件描述符*/
fd=open("/home/test1.c",O_RDWR|O_CREAT,0755);
if(fd<0)
printf("Openfilefali!
\n");
else
printf("Openfilesucessfully!
\n");
}
6创建文件——creat
在《》一书中,找到函数名
利用mancreat查找函数的帮助文件
编写程序代码——
#include
#include
#include
#include
voidmain()
{
intfd;
fd=creat("/home/test2.c",0621);
if(fd<0)
printf("createfilefail!
\n");
else
printf("Createfilesuccessfully!
\n");
}
7在《》一书中,找到函数名
manclose查找函数原型
编写程序代码close.c
#include
#include
#include
#include
voidmain()
{
intfd;
fd=open("/home/test2.c",O_RDWR|O_CREAT,0755);
if(fd<0)
printf("createfilefail!
\n");
else
printf("Createfilesuccessfully!
\n");
intret;
ret=close(fd);
if(ret==0)
printf("Filehasbeenclosed!
\n");
else
printf("Failtoclose!
\n");
}
8首先查找一下读文件的函数read()
man所查询的是一个手册,首先从章节一里面找关键字,如果没有找到,再到后续章节中找。
man2read
man章节一命令
章节二系统调用
章节三库函数
范例:
#include
voidmain()
{
intfd;
fd=open("/home/test1.c",O_RDWR|O_CREAT,0755);
if(fd<0)
printf("createfilefail!
\n");
else
printf("Createfilesuccessfully!
\n");
charbuf[10];/*定义一个数组,有10个空间;用来存放读取出的数据*/
ssize_tcount;
count=read(fd,buf,5);/*将读取出的字符存放到buf指向的空间里面。
*/
if(count==-1)
printf("Readfail!
");
else
printf("Read%dBytes.\n",count);
buf[5]='\0';/*这样,读取后的内容无乱码字符出现。
*/
printf("bufis%s.\n",buf);/*打印字符串*/
intret;
ret=close(fd);
if(ret==0)
printf("Filehasbeenclosed!
\n");
else
printf("Failtoclose!
\n");
}
9写文件
找到写文件对应的函数write()
man2write
write.c
#include
#include
#include
#include
voidmain()
{
intfd;
fd=open("/home/test2.c",O_RDWR|O_CREAT,0755);
if(fd<0)
printf("createfilefail!
\n");
else
printf("Createfilesuccessfully!
\n");
char*buf="987654321";
ssize_tcount;
count=write(fd,buf,7);
if(count==-1)
printf("Writefail!
");
else
printf("Write%dBytes.\n",count);
printf("Theoriginalbufis%s.\n",buf);
intret;
ret=close(fd);
if(ret==0)
printf("Filehasbeenclosed!
\n");
else
printf("Failtoclose!
\n");
}
10定位文件
lseek()
在此之前,先实验一下,能否在文件写入之后,直接读取刚才写入的内容?
实验验证,没有读到数据。
这就是我们要给大家介绍的文件读写指针。
当打开文件时,指针位于文件头部,然而,当对文件进行读或者写操作后,文件指针将发生变化。
介绍,如何设置指针的位置。
范例:
#include
#include
#include
#include
#include
voidmain()
{
intfd;
fd=open("/home/test2.c",O_RDWR|O_CREAT,0755);
if(fd<0)
printf("createfilefail!
\n");
else
printf("Createfilesuccessfully!
\n");
char*buf="987654321";
ssize_tcount;
count=write(fd,buf,7);
if(count==-1)
printf("Writefail!
");
else
printf("Write%dBytes.\n",count);
printf("Theoriginalbufis%s.\n",buf);
off_tref;
ref=lseek(fd,0,SEEK_SET);
if(ref==-1)
printf("Failtoshift.\n");
else
printf("Thedistancetofile_headis%dBytes.\n",ref);
charbuf_r[10];/*定义一个数组,有10个空间;用来存放读取出的数据*/
ssize_tcount_r;
count_r=read(fd,buf_r,5);/*将读取出的字符存放到buf指向的空间里面。
*/
if(count_r==-1)
printf("Readfail!
");
else
printf("Read%dBytes.\n",count_r);
buf_r[5]='\0';/*这样,读取后的内容无乱码出现。
*/
printf("buf_ris%s.\n",buf_r);/*打印读出的字符串*/
intret;
ret=close(fd);
if(ret==0)
printf("Filehasbeenclosed!
\n");
else
printf("Failtoclose!
\n");
}
11复制文件描述符dup()
可以利用新复制的文件描述符fd_new来操作oldfd所指定的文件。
就好比一个人有两个身份证号码。
/*利用dup()函数复制后的文件描述符不同于原来的,但共同指向同一个文件*/
范例:
dup.c
#include
#include
#include
#include
#include
voidmain()
{
intfd;
fd=open("/home/test2.c",O_RDWR|O_CREAT,0755);
if(fd<0)
printf("createfilefail!
\n");
else
printf("Createfilesuccessfully!
\n");
char*buf="987654321";
ssize_tcount;
count=write(fd,buf,7);
if(count==-1)
printf("Writefail!
");
else
printf("Write%dBytes.\n",count);
printf("Theoriginalbufis%s.\n",buf);
off_tref;
ref=lseek(fd,0,SEEK_SET);
if(ref==-1)
printf("Failtoshift.\n");
else
printf("Thedistancetofile_headis%dBytes.\n",ref);
intnewfd;
newfd=dup(fd);
if(newfd==-1)
printf("Failtocopytheoldfd.\n");
else
printf("Thenewfdis%d.\n",newfd);
charbuf_r[10];/*定义一个数组,有10个空间;用来存放读取出的数据*/
ssize_tcount_r;
count_r=read(newfd,buf_r,5);/*将读取出的字符存放到buf指向的空间里面。
*/
if(count_r==-1)
printf("Readfail!
");
else
printf("Read%dBytes.\n",count_r);
buf_r[5]='\0';/*这样,读取后的内容无乱码出现。
*/
printf("buf_ris%s.\n",buf_r);/*打印读出的字符串*/
intret;
ret=close(fd);
if(ret==0)
{
printf("Filehasbeenclosed!
\n");
printf("Theoldfdandthenewfdare%d&%d.\n",fd,newfd);
}
else
printf("Failtoclose!
\n");
}
13综合实例——编写文件复制程序
cp参数1参数2
源文件、目标文件
将源文件的所有内容复制到目标文件中;
思路:
打开源文件,打开目标文件;
读取源文件的数据,将数据写入目标文件;
openreadwrite
查阅编写的函数手册。
源文件是什么、目标文件是什么?
通过main()函数的参数传进去。
编写文件复制程序——copy.c
#include
#include
#include
#include
#include
voidmain(intargc,char**argv)/*argv[0]存放命令的名字,argv[1]存放参数1,argv[2]存放参数2*/
{
/*打开源文件*/
intfd_s;
fd_s=open(argv[1],O_RDONLY);
/*打开目标文件*/
intfd_d;
fd_d=open(argv[2],O_RDWR|O_CREAT,0666);
/*读取源文件数据*/
/*考虑当读取的数据量很大*/
charbuf[512];
intcount=0;/*实际读取的数据量*/
while((count=read(fd_s,buf,512))>0)
{
/*将读取出的源文件数据写入目标文件*/
write(fd_d,buf,count);
}
/*关闭*/
close(fd_s);
close(fd_d);
}
/****************
运行时,是如何执行的?
答:
./copy/home/test2.c/home/test3.c
********************************************/
中间的数字是什么意思呢?
是man的分卷号,原来man分成很多部分,分别是:
1用户命令,可由任何人启动的。
2系统调用,即由内核提供的函数。
3例程,即库函数,比如标准C库libc。
4设备,即/dev目录下的特殊文件。
5文件格式描述,例如/etc/passwd。
6游戏,不用解释啦!
7杂项,例如宏命令包、惯例等。
8系统管理员工具,只能由root启动。
9其他(Linux特定的),用来存放内核例行程序的文档。
n新文档,可能要移到更适合的领域。
o老文档,可能会在一段期限内保留。
l本地文档,与本特定系统有关的。
要查属于哪一部分的,就用哪一部分的编号在命令之前。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 系统 调用 方式 文件 编程