LinuxLinux学习之路

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

2020-08-12  本文已影响0人  QuietHeart

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之后父子之间共享打开文件的图)。

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

上一篇 下一篇

猜你喜欢

热点阅读