小心lseek的返回值

转载自:http://book.51cto.com/art/201701/528116.htm

对于Linux中的大部分系统调用来说,如果返回值是负数,那它一般都是错误的,但是对于lseek来说这条规则不适用。且看lseek的返回值说明:

当lseek执行成功时,它会返回最终以文件起始位置为起点的偏移位置。如果出错,则返回-1,同时errno被设置为对应的错误值。

也就是说,一般情况下,对于普通文件来说,lseek都是返回非负的整数,但是对于某些设备文件来说,是允许返回负的偏移量。因此要想判断lseek是否真正出错,必须在调用lseek前将errno重置为0,然后再调用lseek,同时检查返回值是否为-1及errno的值。只有当两个同时成立时,才表明lseek真正出错了。

因为这里的文件偏移都是内核的概念,所以lseek并不会引起任何真正的I/O操作。

注:对于ftruncate等函数依然适用

posted @ 2019-09-19 10:34  aij  阅读(2764)  评论(0编辑  收藏  举报