lseek函数的用法

lseek函数的用法所有打开的文件都有一个当前文件偏移量(currentfileoffset),以下简称为cfo。cfo通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于cfo,并且使cfo增大,增量为读写的字节数。文件被打开时,cfo会被初始化为0,除非使用了O_APPEND 。   使用lseek函数可以改变文件的cfo。       #in…

大家好,又见面了,我是你们的朋友全栈君。

所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了O_APPEND 

    使用 lseek 函数可以改变文件的 cfo 。

        #include <unistd.h>

        #include <sys/types.h>

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

                    返回值:新的偏移量(成功),-1(失败)

参数 offset 的含义取决于参数 whence:

    1. 如果 whence 是 SEEK_SET,文件偏移量将被设置为 offset。
    2. 如果 whence 是 SEEK_CUR,文件偏移量将被设置为 cfo 加上 offset,
       offset 可以为正也可以为负。
    3. 如果 whence 是 SEEK_END,文件偏移量将被设置为文件长度加上 offset,
       offset 可以为正也可以为负。

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

    lseek 的以下用法返回当前的偏移量

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

这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数 fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 为ESPIPE

    对于普通文件(regular file),cfo 是一个非负整数。但对于特殊设备,cfo有可能是负数。因此,我们不能简单地测试 lseek 的返回值是否小于 0 来判断 lseek 成功与否,而应该测试 lseek 的返回值是否等于 -1 来判断 lseek 成功与否。

    lseek 仅将 cfo 保存于内核中,不会导致任何 I/O 操作。这个 cfo 将被用于之后的读写操作。

    如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。

    以下程序创建一个有空洞的文件:

        /* 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

同时也可以参考:http://baike.baidu.com/view/1080860.htm

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149995.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • TM影像波段介绍「建议收藏」

    TM影像波段介绍「建议收藏」一、各波段特征:1.TM10.45-0.52um,蓝波段,对水体穿透强,对叶绿素与叶色素反映敏感,有助于判别水深及水中叶绿素分布以及水中是否有水华等.2.TM20.52-0.60um,绿波段,对健康茂盛植物的反射敏感,对力的穿透力强,用于探测健康植物绿色反射率,按绿峰反射评价植物的生活状况,区分林型,树种和反映水下特征.3.TM30.62-0.69UM,红波段,叶绿

  • dede中弹出框函数function ShowMsg

    dede中弹出框函数function ShowMsg

  • 重复字符串 leetcode_求字符串的最长无重复字符串

    重复字符串 leetcode_求字符串的最长无重复字符串原题链接给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,”pwk

  • websocket设置header(HttpCanary)

    OkHttpClient的性能要优于HttpClient,因此本例来教大家如何配置使用它.在要使用的地方直接@Autowired即可:测试:

  • django 视图_django admin视图

    django 视图_django admin视图视图家族drf的视图总共分为以下4个,对应4个源码文件views:视图类generics:工具视图mixins:视图工具集viewsets:视图集学习曲线我们学习视图,可以按照以下的曲线

  • 有哪些域名可以提交备案

    有哪些域名可以提交备案

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号