轉載自: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等函數依然適用