每個打開的檔案都記錄著當前讀寫位置,打開檔案時讀寫位置是0,表示檔案開頭,通常讀寫多少個位元組就會將讀寫位置往後移多少個位元組。但是有一個例外,如果以O_APPEND
方式打開,每次寫操作都會在檔案末尾追加數據,然後將讀寫位置移到新的檔案末尾。lseek
和標準I/O庫的fseek
函數類似,可以移動當前讀寫位置(或者叫偏移量)。
#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence);
參數offset
和whence
的含義和fseek
函數完全相同。只不過第一個參數換成了檔案描述符。和fseek
一樣,偏移量允許超過檔案末尾,這種情況下對該檔案的下一次寫操作將延長檔案,中間空洞的部分讀出來都是0。
若lseek
成功執行,則返回新的偏移量,因此可用以下方法確定一個打開檔案的當前偏移量:
off_t currpos; currpos = lseek(fd, 0, SEEK_CUR);
這種方法也可用來確定檔案或設備是否可以設置偏移量,常規檔案都可以設置偏移量,而設備一般是不可以設置偏移量的。如果設備不支持lseek
,則lseek
返回-1,並將errno
設置為ESPIPE
。注意fseek
和lseek
在返回值上有細微的差別,fseek
成功時返回0失敗時返回-1,要返回當前偏移量需調用ftell
,而lseek
成功時返回當前偏移量失敗時返回-1。