LSEEK - Linux手册页

时间:2019-08-20 17:58:57  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2020-08-13

名称

lseek-重新定位读取/写入文件的偏移量

语法

#包括
#包括

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

说明

lseek()根据wherece指令将与文件描述符fd关联的打开文件描述的文件偏移重新定位为参数偏移,如下所示:

SEEK_SET
文件偏移设置为偏移字节。
SEEK_CUR
文件偏移设置为当前位置加上偏移字节。
SEEK_END
文件偏移量设置为文件大小加上偏移量字节。

lseek()允许将文件偏移设置为超出文件末尾(但这不会更改文件的大小)。如果此时稍后再写入数据,则后续读取间隙("空洞")中的数据将返回空字节(aq \ 0aq),直到将数据实际写入间隙为止。

Seeking file data and holes

从3.1版开始,Linux支持下列附加值:

SEEK_DATA
将文件偏移量调整到文件中下一个大于或等于包含数据的偏移量的位置。如果offset指向数据,则将文件offset设置为offset。
SEEK_HOLE
将文件偏移调整到文件中的下一个孔,使其大于或等于偏移。如果偏移量指向孔的中间,则文件偏移量将设置为偏移量。如果没有超出偏移的孔,则将文件偏移调整到文件的末尾(即,在任何文件的末尾都有一个隐式孔)。

在上述两种情况下,如果偏移量指向文件末尾,则lseek()将失败。

这些操作允许应用程序在稀疏分配的文件中映射孔。这对于文件备份工具等应用程序很有用,如果它们具有发现漏洞的机制,则可以在创建备份时节省空间并保留漏洞。

出于这些操作的目的,空洞是零序列(通常未在基础文件存储中分配)。但是,文件系统没有义务报告漏洞,因此这些操作不是映射实际分配给文件的存储空间的保证机制。 (此外,实际上已写入基础存储的零序列可能不会报告为空洞。)在最简单的实现中,文件系统可以通过使SEEK_HOLE始终返回文件末尾的偏移量来支持这些操作,并使SEEK_DATA始终返回偏移量(即,即使偏移量所指的位置是一个孔,也可以认为它由零序列组成的数据组成)。

为了从中获取SEEK_DATA和SEEK_HOLE的定义,必须定义_GNU_SOURCE功能测试宏。

以下文件系统支持SEEK_HOLE和SEEK_DATA操作:

*
Btrfs(从Linux 3.1开始)
*
OCFS(从Linux 3.2开始)
*
XFS(从Linux 3.5开始)
*
ext4(自Linux 3.8起)
*
tmpfs(5)(从Linux 3.8开始)
*
NFS(从Linux 3.18开始)
*
FUSE(自Linux 4.5起)
*
GFS2(从Linux 4.15开始)

返回值

成功完成后,lseek()返回结果偏移量位置,从文件开头开始以字节为单位。发生错误时,将返回值(off_t)-1,并且将errno设置为指示错误。

错误说明

EBADF
fd不是打开的文件描述符。
EINVAL
无效。或:产生的文件偏移量将为负,或超出可搜索设备的末尾。
ENXIO
whence是SEEK_DATA或SEEK_HOLE,并且偏移量超出文件末尾,或者whence是SEEK_DATA且偏移量在文件末尾的孔内。
EOVERFLOW
结果文件偏移不能用off_t表示。
ESPIPE
fd与管道,套接字或FIFO关联。

遵循规范

POSIX.1-2001,POSIX.1-2008,SVr4、4.3BSD。

SEEK_DATA和SEEK_HOLE是Solaris,FreeBSD和DragonFly BSD中也存在的非标准扩展。建议将它们包含在下一个POSIX修订版中(问题8)。

备注

有关文件描述符,打开的文件描述和文件之间关系的讨论,请参见open(2)。

如果在打开的文件描述中设置了O_APPEND文件状态标志,则无论使用lseek()为何,write(2)始终将文件偏移量移动到文件的末尾。

off_t数据类型是POSIX.1指定的有符号整数数据类型。

某些设备无法搜索,并且POSIX未指定哪些设备必须支持lseek()。

在Linux上,在终端设备上使用lseek()失败,并显示错误ESPIPE。

另外参见

dup(2),fallocate(2),fork(2),open(2),fseek(3),lseek64(3),posix_fallocate(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/