lseek()函數的原型及(ji)使用方法(fa),超(chao)詳細
時間:2018-07-19 來源:未知
對于所有打開(kai)的(de)(de)文(wen)件(jian)(jian)都有一個當(dang)前文(wen)件(jian)(jian)偏(pian)(pian)(pian)移量(liang)(current file offset),文(wen)件(jian)(jian)偏(pian)(pian)(pian)移量(liang)通(tong)常是一個非負(fu)整數(shu),用于表(biao)明文(wen)件(jian)(jian)開(kai)始(shi)處到(dao)文(wen)件(jian)(jian)當(dang)前位置的(de)(de)字節數(shu)。讀寫(xie)操作通(tong)常開(kai)始(shi)于當(dang)前文(wen)件(jian)(jian)偏(pian)(pian)(pian)移量(liang)的(de)(de)位置,并(bing)且使其(qi)增大(da),增量(liang)為(wei)(wei)讀寫(xie)的(de)(de)字節數(shu)。文(wen)件(jian)(jian)被(bei)打開(kai)時,文(wen)件(jian)(jian)的(de)(de)偏(pian)(pian)(pian)移量(liang)會(hui)被(bei)初始(shi)化為(wei)(wei) 0,除非使用了O_APPEND 。
讀(du)寫操作可以使(shi)文(wen)件的偏移量發(fa)生變化(hua);而lseek 函(han)(han)數也(ye)可以改變文(wen)件的當前位置。下面我們一塊來看(kan)一下關于lseek函(han)(han)數的原型及(ji)使(shi)用方法(fa)。
通過man手冊查看到lseek函數原(yuan)型如下:需要的頭文件為
#include
#include
off_t lseek(int fd, off_t offset, int whence);
參數(shu):fd:文件(jian)描述符
offset:文件偏(pian)移量
whence:文件(jian)偏(pian)移相對位置(zhi)
返(fan)回(hui)值:成(cheng)功(gong):返(fan)回(hui)文(wen)件(jian)新的偏(pian)移(yi)量(成(cheng)功(gong))
失敗:-1(失敗)
參數(shu)(shu) offset可(ke)正(zheng)可(ke)負(fu),負(fu)數(shu)(shu)時向文件開頭偏移,正(zheng)數(shu)(shu)相對于文件末尾(wei)偏移
參數 offset 的含義取決(jue)于(yu)參數 whence:
1. 如果 whence 是 SEEK_SET,offset相對(dui)于文件開頭進行偏移
2. 如果 whence 是(shi) SEEK_CUR,offset相(xiang)對文件當前位置進行(xing)偏移
3. 如果 whence 是(shi) SEEK_END,offset相對于(yu)文件(jian)末尾(wei)進行偏移
對于whence參數的選項SEEK_SET、SEEK_CUR 和 SEEK_END 是 System V 引入的,在這(zhe)之前使用的是 0、1 和 2。
lseek 的以下用法返回當前的偏移量(liang):
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);
這(zhe)個技巧也可(ke)用(yong)于判斷我們是否可(ke)以改變某個文(wen)件的(de)偏移量。如果(guo)參數 fd(文(wen)件描述符)指定的(de)是 pipe(管道)、FIFO 或(huo)者 socket,lseek 返回 -1 并且置(zhi) errno 為(wei)ESPIPE。
對于普(pu)通文件(regular file),文件偏移量(liang)是(shi)一個非負整數。但對于特殊設備,文件偏移量(liang)有可(ke)能是(shi)負數。因此,我(wo)們不能簡單地測試(shi)(shi) lseek 的返回(hui)值是(shi)否(fou)(fou)小于 0 來判斷 lseek 成功(gong)與否(fou)(fou),而應該測試(shi)(shi) lseek 的返回(hui)值是(shi)否(fou)(fou)等(deng)于 -1 來判斷 lseek 成功(gong)與否(fou)(fou)。
lseek 僅將(jiang)文件偏移(yi)位置保(bao)存于內核中,不(bu)會導致任何(he) I/O 操作。
如(ru)果 offset 比文(wen)件(jian)的當前(qian)長度更大,下(xia)一個(ge)寫(xie)操作(zuo)就會把文(wen)件(jian)“撐(cheng)大(extend)”。這(zhe)就是(shi)(shi)所謂(wei)的在文(wen)件(jian)里創造(zao)“空(kong)洞(dong)(dong)(hole)”。沒有(you)(you)被實際寫(xie)入文(wen)件(jian)的所有(you)(you)字節由重復的 0 表示。空(kong)洞(dong)(dong)是(shi)(shi)否占用(yong)硬盤空(kong)間是(shi)(shi)由文(wen)件(jian)系統(file system)決定的。
以下程序創(chuang)建一個有(you)空洞的文件(jian):
#include
#include
#include
#include
char buf1[] = "abcdefghij";
char buf2[] = "ABCDEFGHIJ";
int main(void)
{
int fd, size;
if ((fd = open("file.hole", O_RDONLY|O_CREATO_TRUNC, 0666)) < 0)
{
printf("open error\n");
return -1;
}
size = sizeof (buf1) - 1;
if (write(fd, buf1, size) != size)
{
printf("buf1 write error\n");
return -1;
}
/* offset now = 10 */
if (lseek(fd, 16384, SEEK_SET) == -1)
{
printf("lseek error\n");
return -1;
}
/* offset now = 16384 */
size = sizeof buf2 - 1;
if (write(fd, buf2, size) != size)
{
printf("buf2 write error\n");
return -1;
}
/* offset now = 16394 */
return 0;
}

