• 《UNIX环境高级编程》笔记--文件共享


    1.文件共享

    内核使用3种数据结构来表示打开的文件,他们的关系如下:
    每个进程都有一张进程表项,记录进程打开的文件:
    fd标志:close_on_exec,若一个文件描述符在close_on_exec中的对应比特、位被设置,那么在执行execve()时该描述符将被关闭,
    否则该描述符将始终处于打开状态。
    文件指针:指向文件表。

    文件表:
    文件状态标志:read,write,append,sync等,即open的 flag参数。
    当前文件偏移量:当执行了write后,当前文件偏移量就增加了相应的长度,如果偏移量超过了文件的长度,则将i节点表中的当前
    文件长度设置为文件偏移量。当使用O_APPEND打开文件后,首先将文件偏移量设置为i节点表中的当前文件长度。
    v节点指针:指向v节点表。

    v节点表:
    v节点包含了文件类型和对此文件进行各种操作的函数指针。
    v节点还包含了该文件的i节点(i-node)。
    (linux没有使用v节点,只使用了通用i节点结构,这2种实现上有所不同,但是概念上是一样的)

    上图表示一个进程打开了2个不同的文件,一个是标准输入,一个是标准输出。
    下图表示2个不同的进程打开同一个文件。


    2.dup和dup2函数

    这2个函数是用来复制一个现存的文件描述符,函数的定义如下:
    #include <unistd>
    int dup(int filedes); //复制filedes,并返回新的filedes(该文件描述符是当前可用文件描述符中最小值),如出错,返回-1
    int dup2(int filedes, int filedes2); 
    //使用filedes2复制filedes,如果filedes2已经打开,则先关闭它;如果filedes等于filedes2,则返回filedes2,而不关闭它。

    下图显示了执行如下语句的结果:(假设当前可用文件描述符的最小值是3)
    newfd = dup(1);



    复制一个文件描述符的另一种方法是使用fcntl函数,这个函数会在以后进行介绍。


  • 相关阅读:
    判断一个数是否是偶数,你真的仔细去考虑过么
    由懒加载所引出的性能优化
    DSAPI之摄像头追踪指定颜色物体
    DSAPI多功能组件编程应用反射相关
    DSAPI HTTP监听服务端与客户端_指令版
    DSAPI多功能组件编程应用网络相关(中)
    DSAPI多功能组件编程应用网络相关(上)
    DSAPI多功能组件编程应用HTTP监听服务端与客户端
    DSAPI HTTP监听服务端与客户端
    DSAPI多功能组件编程应用图形图像篇(中)
  • 原文地址:https://www.cnblogs.com/james1207/p/3320214.html
Copyright © 2020-2023  润新知