久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > lseek()函數的原型及使用方法,超詳細

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&quot;, 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;

}

上一篇:udp編程步驟詳解,就是如此的簡單

下一篇:nm命令使用詳解,讓你加快學習速度

熱點文章推薦
華清(qing)學員就業榜單
高(gao)薪學員經驗分享
熱(re)點新聞推(tui)薦
前臺專(zhuan)線:010-82525158 企(qi)業培訓洽談專(zhuan)線(xian):010-82525379 院校合(he)作洽談專線(xian):010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部