日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

lseek函数的用法

發(fā)布時(shí)間:2023/12/19 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 lseek函数的用法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

所有打開的文件都有一個(gè)當(dāng)前文件偏移量(current file offset),以下簡(jiǎn)稱為 cfo。cfo 通常是一個(gè)非負(fù)整數(shù),用于表明文件開始處到文件當(dāng)前位置的字節(jié)數(shù)。讀寫操作通常開始于 cfo,并且使 cfo 增大,增量為讀寫的字節(jié)數(shù)。文件被打開時(shí),cfo 會(huì)被初始化為 0,除非使用了O_APPEND。

使用 lseek 函數(shù)可以改變文件的 cfo 。

#include<unistd.h>

#include <sys/types.h>

off_t lseek(int filedes, off_t offset, int whence);

返回值:新的偏移量(成功),-1(失?。?/p>

參數(shù) offset 的含義取決于參數(shù) whence:

1. 如果 whence 是SEEK_SET,文件偏移量將被設(shè)置為 offset。
2. 如果 whence 是SEEK_CUR,文件偏移量將被設(shè)置為 cfo 加上 offset,
offset 可以為正也可以為負(fù)。
3. 如果 whence 是SEEK_END,文件偏移量將被設(shè)置為文件長(zhǎng)度加上 offset,
offset 可以為正也可以為負(fù)。

SEEK_SET、SEEK_CUR 和 SEEK_END 是 System V 引入的,在這之前使用的是 0、1 和 2。

lseek 的以下用法返回當(dāng)前的偏移量:

off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);

這個(gè)技巧也可用于判斷我們是否可以改變某個(gè)文件的偏移量。如果參數(shù) fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 為ESPIPE。

對(duì)于普通文件(regular file),cfo 是一個(gè)非負(fù)整數(shù)。但對(duì)于特殊設(shè)備,cfo有可能是負(fù)數(shù)。因此,我們不能簡(jiǎn)單地測(cè)試 lseek 的返回值是否小于 0 來判斷 lseek 成功與否,而應(yīng)該測(cè)試 lseek 的返回值是否等于 -1 來判斷 lseek 成功與否。

lseek 僅將 cfo 保存于內(nèi)核中,不會(huì)導(dǎo)致任何 I/O 操作。這個(gè) cfo 將被用于之后的讀寫操作。

如果 offset 比文件的當(dāng)前長(zhǎng)度更大,下一個(gè)寫操作就會(huì)把文件“撐大(extend)”。這就是所謂的在文件里創(chuàng)造“空洞(hole)”。沒有被實(shí)際寫入文件的所有字節(jié)由重復(fù)的 0表示??斩词欠裾加糜脖P空間是由文件系統(tǒng)(file system)決定的。

以下程序創(chuàng)建一個(gè)有空洞的文件:

/* Standard C header */
#include<stdio.h>
/* Unix header */
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>

char buf1[] = “abcdefghij”;
char buf2[] = “ABCDEFGHIJ”;

int main(void)
{

int fd, size;

if ((fd = creat(“file.hole”, S_IRUSR|S_IWUSR)) < 0)
{

printf(“creat 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;
}

摘自:http://blog.csdn.net/songyang516/article/details/6779950

同時(shí)也可以參考:http://baike.baidu.com/view/1080860.htm

總結(jié)

以上是生活随笔為你收集整理的lseek函数的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。