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

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SQL Server 2012 下载和安装详细教程

    官网下载地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=29066选择图片中的三个,然后点击下载,文件内存很大下载以后,如图所示,双击.exe程序进行安装安装结束以后,就会有SQLFULL_x64_CHS文件夹生成打开SQLFULL_x64_CHS文件夹,双击SETUP应用程序,…

    2022年4月6日
    161
  • linux下安装tomcat7

    linux下安装tomcat7安装环境LinuxcenterOS6.5tomcat安装(apache-tomcat-7.0.73.tar.gz)Tomca下载地址:http://tomcat.apache.org/download-70.cgi下载后解压:tar-zxvfapache-tomcat-7.0.73.tar.gz建立软连接:ln-sapache-tomcat-7.0.73.tar.gztomcat7设

    2022年5月18日
    37
  • spring boot springcloud(内网vue项目搭建)

    目录编写第一个REST接口读取配置文件profiles多环境配置热部署actuator监控自定义actuator端点统一异常处理异步执行随机端口编译打包在SpringTools4forEclipse中依次选择File->New->MavenProject,然后在出现的界面中按图1所示增加相关信息。图1创建maven项目完了上述操作之后,在pom.xml中添加SpringBoot的依赖…

    2022年4月16日
    111
  • 什么是SOA架构?为什么使用SOA架构?「建议收藏」

    什么是SOA架构?为什么使用SOA架构?「建议收藏」SOA架构简介面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互**SOA具有以下五个特征**1.可重用;2.松耦合;3.明确定义的接口;…

    2022年6月24日
    27
  • VLAN配置实例_ipsec配置步骤

    VLAN配置实例_ipsec配置步骤实验拓扑图实验要求:1.PC1和PC3所在接口为access;PVLANVLAN2PC2/4/5/6处于同一网段;其中PC2可以访问PC4/5/6;但PC4可以访问PC5,不能访问PC6;2.PC5不能访问PC6实验配置思路:1.PC2/4/5/6处于同一网段–DHCP下放IP地址PC1/3–使用路由器子接口DHCP下放IP地址2.为满足实验要求:将PC2划分到VLAN3、可以在同一VALN,也可以在不同VLAN,在这,我是把PC4/PC5都划分到VLAN4、PC6划分到VLAN5

    2022年9月19日
    0
  • 佳文分享:CAP定理

    佳文分享:CAP定理

    2021年12月13日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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