linux入门培训教程linux系统中文件

上传人:shaoy****1971 文档编号:108291844 上传时间:2019-10-23 格式:DOCX 页数:10 大小:40.38KB
返回 下载 相关 举报
linux入门培训教程linux系统中文件_第1页
第1页 / 共10页
linux入门培训教程linux系统中文件_第2页
第2页 / 共10页
linux入门培训教程linux系统中文件_第3页
第3页 / 共10页
linux入门培训教程linux系统中文件_第4页
第4页 / 共10页
linux入门培训教程linux系统中文件_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《linux入门培训教程linux系统中文件》由会员分享,可在线阅读,更多相关《linux入门培训教程linux系统中文件(10页珍藏版)》请在金锄头文库上搜索。

1、 http:/ Linux入门培训教程linux系统中文件I/O教程linux 文件I/O教程(1)一,文件描述符对内核而言,所以打开的文件都通过文件描述符引用。每个进程都有一些与之关联的文件描述符。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为参数传送给read和write。一般有三个以及打开的文件描述符,他们是:复制代码代码如下:0:标准输入 STDIN_FILENO1:标准输出 STDOUT_FILENO2标准错误输出 STDERR_FILENO每行后面的符号常

2、量是依从POSIX而定的。open函数复制代码代码如下:#include #include #include int open(const char *pathname, int flags);int open(const char *pathname, int flags,mode_t mode);pathname是要打开或创建文件的名字。flag用来定义打开文件所采取的的动作,必须调用以下模式之一O_RDONLY, O_WRONLY, O_RDWR分别代表只读,只写,读写方式打开。open还可以包括以下可选模式的组合O_APPEND:把写入数据追加到文件的尾端O_CREAT:若文件不存在,

3、则创建它。使用此选项时,需要第三个参数mode,用其指定该新文件的访问权限。O_EXCL:如果同时指定了O_CREAT,而文件存在,则会出错。用此可以测试一个文件是否存在,如果存在,则创建文件,这使测试和创建两者成为一个原子操作。O_TRUNC: 如果此文件存在,而且为只写或读写成功打开,则将其长度截为0。open返回的文件描述符一定是最小的未用描述符数值。这一点被某些应用程序用在标准输入,标准输出或标准错误输出上。如,一个程序关闭了自己的标准输出,然后再次调用open,文件描述符1就会被调用,并且标准输出将被有效的重定向到另一个文件或设备。POSIX规范还标准化了一个creat调用,此函数等

4、效于open(pathname,O_WONLY |O_CREAT | O_TRUNC, mode);close函数#include int close(int fd);close调用终止一个文件描述符fd与对应文件之间的关联。文件描述符被释放后并能重新使用。close调用成功返回0,出错返回-1.关闭一个文件时会释放该进程加在文件上的所有记录锁。当一个进程终止时,内核自动关闭它所有打开的文件。lseek函数每个打开的文件都有一个与其相关联的”当前文件偏移量”。按系统默认情况,当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置为0。lseek可以为一个打开的文件设置偏移量。复制代

5、码代码如下:#include #include off_t lseek(int fd, off_t offset, intwhence);offset用来指定位置,whence参数定义该偏移值的用法。whence可取以下值:复制代码代码如下:SEEK_SET: The offset is set to offset bytes.SEEK_CUR: The offset is set to its current locationplus offset bytes.SEEK_END: The offset is set to the size of the fileplus offset byt

6、es.成功调用返回从文件头到文件指针被设置处的字节偏移值,失败返回-1。参数offset定义在中。当偏移量大于文件长度时,出现空洞,空洞不占用存储区。read函数复制代码代码如下:#include ssize_t read(int fd, void *buf, size_tcount);将与文件描述符fd关联的文件中读入count个字符放到buf中。返回读入的字节数,它可能小于请求的字节数。如果read调用返回0,就表示未读入任何数据,已到达了文件尾。返回-1,就表示出错。write函数复制代码代码如下:#include ssize_t write(int fd, const void *bu

7、f,size_t count);把缓冲区buf的前count个字节写入与文件描述符fd相关联的文件中。返回实际写入的字节数,通常与count值相同;否则表示出错。出错的一个常见原因是:磁盘已写满,或者超出了一个给定进程的文件长度限制。实例:创建一个文件,写入数据,移动当前偏移量,在读数据。复制代码代码如下:#include /必须最早出现,因为它可能会影响到其他头文件。#include#include#include#includeint main()char* filename = ./file;char buf100;char buf15;int fd;printf(open a file

8、 to writen);if(fd = open(filename,O_RDWR|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH )=-1)perror(cannot open filen);return 1;printf(open file successfully!n);printf(input a string:);gets(buf);/write intofileif(write(fd,buf,strlen(buf) !=strlen(buf)perror(cannot write intofilen);return 1;close(fd

9、);printf(open file to read.n);if(fd=open(filename,O_RDONLY) = -1)perror(cannot open thefile.n);return 1;if(lseek(fd,3,SEEK_SET) = -1)perror(lseek erroen);return 1;/read from the fileif(read(fd,buf1,4)=-1)perror(read error.n);return 1;printf(read from file is%sn,buf1);close(fd);return 0;执行与输出结果:复制代码代

10、码如下:rootjb51:$gcc -o io io.crootjb51:$./ioopen a file towriteopen filesuccessfully!input a string:akxivbaslzkncxcasbxbwwvaidxbdopen file toread.read from fileis ivbalinux 文件I/O教程(2)下面介绍了linux中有关文件I/O的相关内容,内核使用三种数据结构表示打开的文件,他们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。一,文件共享内核使用三种数据结构表示打开的文件,他们之间的关系决定了在文件共享方面一

11、个进程对另一个进程可能产生的影响。1) 每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:a) 文件描述符标志b) 指向一个文件表项的指针2) 内核为所有打开文件维持一张文件表。每个文件表项包含:a) 文件状态标志(读、写、读写、添些、同步和阻塞等)b) 当前文件偏移量c) 指向文件v节点表项的指针3) 每个打开文件(或设备)都有一个v节点(v-node)结构。v节点包含了文件类型和对比文件进行各种操作的函数的指针。对于大多数文件,v节点还包含了该文件的i节点。i节点包含文件所有者、文件长度、文件所在的设备、指

12、向文件实际数据块在磁盘上所在位置的指针等。打开文件的内核数据结构如果两个进程各自打开了同一个文件,则如图2所示。假定第一个进程在文件描述符3打开上该文件,而另一个进程在文件描述符4上打开该文件。每个进程都得得到一个文件表项,但对一个给定的文件只有一个v节点表项。每个进程都有自己的文件表项的一个理由是:使每个进程都有自己对该问价的当前偏移量。现在对前一节文件I/O(1)的几个操作进一步说明:1. 完成write之后,文件中当前偏移量即所增加的字节数。如果当前偏移量大于文件长度,则将i节点中当前文件长度设为当前文件偏移量。2. 用O_APPEND打开一个文件,相应标志会被设置到文件状态标识中。每次

13、写时,当前偏移量会被设置为i节点中的文件长度3. lseek定位到文件尾端时,则文件当前偏移量会被设置为当前文件长度。可能有多个文件描述符指向同一文件表项。调用dup和fork时都能看到这一点。多个进程读同一文件能正确工作。但多个进程写同一文件时,可能产生预期不到的后果。可以利用原子操纵避免这种情况。原子操作一般而言,原子操作指的是由多部组成的操作。如果该院自地执行,要么执行完所以步骤,要么一步也不执行。1. 添加至一个文件考虑一个进程,它要讲数据添加到一个文件尾端。早期UNIX不支持open,所以可以如下实现:复制代码代码如下:if(lseek(fd, 0L, 2)0)err_sys(“lseekerror”);if(write(fd, buf, 100) != 100)err_sys(“writeerror”);对于单个进程,这段程序能正常工作。但多个进程就不一定。结社进程A和B都对同一文件进行添加操作。每个进程都打开该文件,此时数据结构之间关系如图2中所示。假定A调用lseek,将A的当前偏移量设置为1500。进程B执行lseek也将其当前偏移量设为1500。然后B调用write,将当前偏移量增至1600。然后内核又进行进程切换使进程A恢复运行,当A调用write时,从其当

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号