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之后父子之间共享打开文件的图)。
当一个文件描述符号从一个进程被传递到另外一个进程的时候,发送进程在传递完了文件描述符号之后会关闭掉文件描述符号。 发送进程关闭文件描述符号并不会真的关闭掉文件或者设备,因为文件描述符号对于接收进程来说仍然是打开的(即便接受进程没有特地接收文件描述符号)。
网友评论