lseek函數用於設置文件偏移量。
每個打開的文件都有一個與其相關聯的“當前文件偏移量”(current file offset)。它通常是一個非負整數,用以度量從文件開始處計算的字節數。通常,讀寫操作都從當前文件偏移量處開始,並使偏移量增加所讀寫的字節數。按系統默認的情況,當打開一個文件時,除非制定O_APPEND選項,否則該偏移量被設置為0。
#include<unistd.h> off_t lseek(int filedes, off_t offset, int whence);
對參數offset 的解釋與參數whence的值有關。
- 若whence是SEEK_SET,則文件偏移量設置為距文件開始處 offset個字節。
- 若whence是SEEK_CUR,則文件偏移量設置為當前值加 offset,offset可為正或負。
- 若whence是SEEK_END,則文件偏移量設置為文件長度加 offset,offset可為正或負。
若lseek成功執行,則返回新的文件偏移量,為此可以用下列方式確定打開文件的當前偏移量:
off_t currpos; currpos = lseek(fd, 0,SEEK_CUR);
這種方法也可用來確定所涉及的文件是否可以設置偏移量。如果文件描述符引用的是一個管道,FIFO或網絡套接字,則lseek返回 -1,並將errno設置為ESPIPE。
文件偏移量可以大於文件的當前長度,在這種情況下,對該文件的下一次寫將加長該文件,並在文件中構成一個空洞。位於文件中但沒有寫過的字節都被讀為0。
文件中的空洞不要求在磁盤上占用存儲區。當定位到超出文件尾端之后寫時,對於新寫的數據需要分配磁盤塊,但是對於原文件尾端和新開始位置之間的部分則不需要分配磁盤塊。