美文网首页
Linux系统编程之文件I/O (一点五)

Linux系统编程之文件I/O (一点五)

作者: iMikasa_ | 来源:发表于2021-12-01 13:01 被阅读0次

    本篇文章的标题是(一点五),一点五是一和二的过渡部分,本篇文章主要讲一些理论知识,有了这些理论知识的铺垫相信以后的系统编程的学习更为顺畅

    再叙文件描述符

    通过前面的文章也能了解到,如果程序想要对文件进行I/O操作,那些系统调用API都用到了文件描述符作为参数,可显文件描述符的重要性。所以我们就具体问题具体分析。

    查阅了各种资料发现,有三张表,是由内核维护的三个数据结构;分别是进程级的文件描述符表、系统级的打开文件表、文件系统的i-node表

    每个进程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针;

    内核对所有打开的文件维护有一个系统级的描述表格,有时称之为打开文件表;而这个表中的每一项存储了与一个打开文件相关的全部信息,如当前文件的偏移量、打开文件时使用的状态标志、文件的访问模式、对该文件i-node对象的引用

    每个文件系统都会为驻留其上的所有文件建立一个i-node表,经过我的查阅资料发现,i-node表中存放的是文件的一些基础信息以及包含文件具体内容的数据块的指针

    其实以上概念只是在我在查阅资料后总结的,仅仅是一些观念,了解一些概念,望不要以偏概全.....

    image.png

    我先举个例子,为了更容易理解,我现在写个程序要以只写 的方式打开文件a.txt,再写个程序以只读的方式打开a.txt,对应在上图中,就是进程a和进程b都要打开文件系统中的同一个文件,在每个进程都有程序所需的文件描述符(在文件描述符表中),他们找到系统中的打开文件表,找到他们读写数据所需的信息如文件偏移量、文件访问模式、状态标志等,因为他们所要读写的文件是同一个文件,说以他们的i-node 指针是一样的,对应的i-node表项也是所需的哪个,然后找到数据块,读写数据块内的数据;

    我们可以通过观察上图发现,进程a中的fd1和fd30都指向了同一个打开文件表项,这个是通过调用dup(),dup2()或fcntl()形成的(文件描述符复制)
    进程a中的fd2和进程b中的fd2都指向了同一个打开文件表项,可能是通过调用fork()形成的(进程a与进程b是父子进程)


    参考

    《Linux/UNIX 系统编程手册》
    《Linux C 一站式学习》
    https://segmentfault.com/a/1190000009724931
    https://www.ruanyifeng.com/blog/2011/12/inode.html
    https://www.modb.pro/db/78812
    https://zhuanlan.zhihu.com/p/143430585
    https://zhuanlan.zhihu.com/p/40604943

    相关文章

      网友评论

          本文标题:Linux系统编程之文件I/O (一点五)

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