文件I/O操作----文件操作相关函数

重点介绍下lseek函数。每个文件打开后都有一个非负整数,表示“当前文件偏移量”,是从文件开始到当前位置的字节数。 

其中lseek函数定位成功返回的是文件偏移量,失败返回-1,并将errno设置为ESPIPE. 注意偏移量可能是负数,所以函数调用失败只能用-1来表示。

文件偏移量可以大于文件长度,这样会得到一个带有空洞的文件。在具有数据之间的空洞占用磁盘存储空间,但是对于原文件尾端和新开始写的位置之间不需要占用磁盘块。

文件共享这里就贴出一张图掌握下进程三张表的关系吧:


lseek函数只修改文件表项中的当前文件偏移量。由于每个进程可以对同一文件进行处理,具有不同的当前文件偏移,所以同一文件具有不同的fd标志。但是v节点表只有一个。

书中又继续介绍了一些原子操作(不能被中断),比如在进行lseek定位后实现对文件尾添加数据时,若同时有两个进程在对文件进行操作,那么可能不能保证每次都是对文件尾进行写入。若在打开文件(open)时,添加O_APPEND属性,可以保证每次write都是在文件尾进行,因此系统每次在write前都会用lseek把offset设置到文件尾。若没有设置O_APPEND属性,那么首次默认为0,即文件开头,offset值跟着每次read和write之后的位置变化.每个文件描述符,在read和write时候共享一个offset,因此在写入文件时候offset会停留在写入字符的尾部。如果设置了O_APPEND的属性,在每次write后如果不设置lseek到头部,则无输出.

另外介绍了dup,fcntl函数,用来复制文件描述符,dup返回的一定是当前可用的最小的正整数,指向同一个文件表的指针。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值