小心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等函数依然适用