Unix系统编程()lseek系统调用

时间:2021-02-14 22:22:22

 

之前知道lseek这个系统调用可以改变文件的偏移量,或者叫偏移量或指针。

 

文件偏移量是指执行下一个read或者write操作的文件起始位置,会以相对于文件头部起始点的文件当前位置来表示。

 

 

文件第一个字节的偏移量为0。

 

文件打开时,会将文件偏移量设置为指向文件的开始,以后每次read或write调用将自动对其进行调整,以指向已读或已写数据后的下一字节。因此连续的read和write调用将按顺序递进,对文件进行操作。

 

lseek会根据offset和whence参数值来调整文件的偏移量。

off_t lseek(int fd, off_t offset, int whence)

 

offset 指定了一个以字节为单位的数值

whence 表明应参照哪个基点来解释offset参数,应为下列其中之一。

 

SEEK_SET 将文件偏移量设置为文件头部起始点开始的offset字节

SEEK_CUR 相对于当前文件偏移量,将文件偏移量调整offset个字节

SEEK_END 将文件偏移量设置为起始于文件尾部的offset个字节,也就是offset应该从文件最后一个字节之后的下一个字节算起。

 

Unix系统编程()lseek系统调用

 

早期的UNIX实现中,whence参数用整数0,1,2来表示的。

 

如果whence参数值为SEEK_CUR或者SEEK_END,那么offset参数可以为正数也可以为负数;如果whence参数值为SEEK_SET,offset参数值必须为非负数。

 

lseek调用成功会返回新的文件偏移量,下面调用只是获取文件偏移量的当前位置,并没有修改它。

curr = lseek(fd, 0, SEEK_CUR);

 

lseek(fd, 0, SEEK_SET);         start of file

lseek(fd, 0, SEEK_END);        Next byte after the end of the file

lseek(fd, –1, SEEK_END);      Last byte of file

lseek(fd, –10, SEEK_CUR);    Ten bytes prior to current location

lseek(fd, 10000, SEEK_END);   10001 bytes past last byte of file

 

lseek调用只是调整内核中与文件描述符相关的文件偏移量记录,并没有引起对任何物理设备的访问。

 

文件偏移量,文件描述符和已打开文件的关系还需要进一步厘清。

 

lseek并不适用于所有类型的文件,不允许将lseek应用于管道、FIFO、socket或者终端。

 

一旦如此,调用将会失败,并将errno置为ESPIPE。

另一方面,只要合情合理,也可以将lseek应用于设备,例如磁盘或者磁带上的某一具体位置。

 

lseek的l来源于long。