美文网首页全栈工程师程序员大学生活
【必看】Linux开发入门实战笔记系列(一):lseek 函数用

【必看】Linux开发入门实战笔记系列(一):lseek 函数用

作者: 曹真 | 来源:发表于2017-05-05 00:50 被阅读202次

    【必看】Linux开发入门笔记系列(一):lseek 函数用法

    这个系列主要是搜集整合网上的资料和一些自己的实践,一方面自己学习记录,另一方面供大家参考。

    每一个部分都会附带一个C语言的简单实现源码,这次的就是lseek.c
    注意,这些代码并非由我编写,而是《UNIX高级环境编程》中的示例代码。

    1.介绍

    首先是man用法的网址:http://man7.org/linux/man-pages/man2/lseek.2.html
    这里可以查看到最全面的用法。

    Standard I/O.png

    其中, write 和 read 被称为不带缓冲的 I/O (unbuffered I/O), 因为每次执行这两个函数,都需要调用内核中的一个系统调用。

    • 文件描述符

    对于内核而言,所有打开的文件都通过文件描述符引用。

    文件描述符是一个非符整数。 当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。 当读或写一个文件时,使用 open 或 creat 返回的文件描述符标识该文件,并将其作为参数传送给 read 或者 write 函数。

    按照惯例,UNIX 系统 SHELL 将描述符 0 、 1 、 2 分别和标准输入、标准输出和标准错误输出相关联。 在遵循 POSIX 规范的程序中,它们分别被定义于 unistd.h 中的常量 STDIN_FILENO 、 STDOUT_FILENO 和 STDERR_FILENO 所代替。

    函数原型如下: lseek.c(2)

    #include  <sys/types.h>
    #include  <fcntl.h>
    
        off_t  lseek(int  filedes,  off_t  offset,  int  whence  );
    
                    Returns: new file offset if OK, -1 on error
    
    

    参数:

    1、filedes是 文件标识符,通过open函数从内核获得的一个文件标识符。

    2、offset 是相对于whence的偏移量。

    3、whence是offset的参照点。

    参数2和参数3共同决定文件的读写偏移量。意思是从相对于whence处offset的地方开始读或者写。
    该函数的执行成功返回文件当前位置的偏移量,若是失败返回-1.

    2.测试用例

    lseek.c 文件

    
    /* 
     * This trivial program verifies whether or not STDIN is seekable.  Test
     * on a regular file, on a pipe or a fifo.
    * lseek.c
     */
    
    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    int
    main(void) {
        if (lseek(STDIN_FILENO, 0, SEEK_CUR) == -1 )
            printf("cannot seek\n");
        else
            printf("seek OK\n");
    
        return 0;
    }
    
    

    下面我们在ubuntu中实践一下
    编译-执行


    lseek_demo1.png

    3. 文件共享

    Note
    以下说明是概念性的,和实际实现不一定匹配。

    内核使用三种数据结构表示打开的文件:
    每个进程在进程表中都有一个记录项,记录项中包含一张文件描述符表(file descriptor table),每个描述符占用一项。与每个文件描述符相关联的是:
    文件描述符标识( close_on_exec

    指向一个文件表项的指针

    内核为所有打开文件维持一张打开文件表(open file table ,简称文件表),每个文件表项包含:
    文件状态标识(读、写、追加、同步和非阻塞等标识)
    当前文件偏移量
    指向该文件 v 节点表项的指针

    每个打开文件(或设备)都有一个v 节点(v-node ,虚拟节点),它包含了文件类型和对次文件进行各种操作的函数指针。对于大多数文件, v 节点还包含了该文件的 i 节点(i-node ,索引节点), i 节点包含了文件的所有者、文件长度、文件所在的设备,文件在磁盘块上的位置指针,等等。

    这些信息是在打开文件时从磁盘上读入内存的,所以所有关于文件的信息都是快速可供使用的。
    以下图片展示了一个打开两个文件的进程:

    IMG_2584.JPG
    IMG_2585.JPG

    相关文章

      网友评论

        本文标题:【必看】Linux开发入门实战笔记系列(一):lseek 函数用

        本文链接:https://www.haomeiwen.com/subject/nkodtxtx.html