重点介绍下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返回的一定是当前可用的最小的正整数,指向同一个文件表的指针。