美文网首页LinuxLinux学习之路
APUE读书笔记-17高级进程通信(8)

APUE读书笔记-17高级进程通信(8)

作者: QuietHeart | 来源:发表于2020-08-12 18:41 被阅读0次

    4、传递文件描述符号

    在进程之间传递打开的文件描述符号这个功能非常强大。它可以使得客户服务程序具有不同的设计方案。它允许一个进程(一般这个进程都是服务进程)去做打开一个文件的所有工作(包括将网络名称转换为网络地址,向modem拨号,协商文件锁,等等),然后简单地向调用进程传递回去一个文件描述符号,这个文件符号可以用于输入输出函数。所有打开文件的细节工作在客户进程端来看都是被隐藏了的。

    我们必须对“传递一个打开的文件描述符号”这个词语非常了解。在最开始的时候,我们展示过两个进程打开同样一个文件的情况,尽管这两个进程共享同样的v-node,但是每一个进程有它自己的文件表项。

    当我们在进程之间传递打开的文件描述符号的时候,我们想要两个进程之间共享同一个文件表项,如下图所示:

                  从上面的进程打开的文件传递到底下的进程
    
    +-process table entry--+
    |     fd     file      |
    |    +flags+-pointer-+ |
    |fd0 |-----|---------| |
    |fd1 |-----|---------| |   ---->+file table---------+
    |fd2 |-----|---------| |  /  -->| file status flags |
    |fd3 |-----|---------|----  /   +-------------------+
    |    |    ......     | |   /    | current offset    |
    |    +---------------+ |   |    +-------------------+
    |                      |   |    | v-node pointer    |------> +-v-node table---+
    +----------------------+   |    +-------------------+        |    v-node      |
                               |                                 |   information  |
                               |                                 +----------------+
    +-process table entry--+   |                                 |    i-node      |
    |     fd     file      |   |                                 |   information  |
    |    +flags+-pointer-+ |  /                                  +_.............._+
    |fd0 |-----|---------| | /                                   |    current     |
    |fd1 |-----|---------| |/                                    |   file size    |
    |fd2 |-----|---------| /                                     +----------------+
    |fd3 |-----|---------|/|
    |fd4 |-----|---------| |
    |    |    ......     | |
    |    +---------------+ |
    |                      |
    |                      |
    +----------------------+
    

    从技术来看,我们将一个指向文件表的指针从一个进程传递给另外一个进程。这个指针被分配给接收进程的第一个可用的文件描述符号。(也就是说,我们传递一个打开的文件描述符号,但是文件描述符号的号码在两个进程中并不一定一样,上图就是一个很明显的例子)两个进程共享一个打开的文件表实际就是调用fork的时候发生的事情(可以参见前面讲述fork时候一个描述fork之后父子之间共享打开文件的图)。

    当一个文件描述符号从一个进程被传递到另外一个进程的时候,发送进程在传递完了文件描述符号之后会关闭掉文件描述符号。 发送进程关闭文件描述符号并不会真的关闭掉文件或者设备,因为文件描述符号对于接收进程来说仍然是打开的(即便接受进程没有特地接收文件描述符号)。

    相关文章

      网友评论

        本文标题:APUE读书笔记-17高级进程通信(8)

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