我读了Stevens关于在进程间传递描述符的例子。总结一下,他的主程序分叉了一个子程序,这个子程序执行另一个程序,这个子程序打开一个文件,把整数的文件描述符传给他。fd
通过unix域套接字返回给父节点并退出。母体收到这个 fd
从套接字中读取文件,并直接用 fd
.
有两个问题。
fork
行为,因为 CLONE_FILES
没有被设置,AFAIK),父母就不能使用 fd
直接从子代中调用。父母需要在其描述符数组中找到一个槽,并将其映射到 file
的对象。Stevens提到了这个问题,但代码似乎没有在接收端做这个映射。file
如果子程序没有增加refcount,那么子程序制造的对象将在进程退出时被释放。同样的,Stevens在代码前的描述中提到了这一点,但代码本身似乎并没有这样做。我发现了一个相关的 所以职位,其中父母和子女的角色是相反的,否则就和史蒂文斯的例子一样。也不知道那个怎么用。
我是不是漏掉了什么?我的猜测是基于Linux的,也许unix与之不同,这两个问题在某种程度上是由内核处理的?感谢帮助!
展开全部答案。
1) 当你在UNIX域套接字上传递一个文件描述符时,消息结构--其中包括 SCM_RIGHTS
吩咐 内核 当文件描述符通过套接字时,在飞行中复制文件描述符,在另一端神奇地出现FD值作为下一个可用的插槽。
正如你在问题中提出的那样,如果FD是按字面意思传递的("嘿,另一端,这里有FD#3,可以做一些事情,祝你好运"),而且FD已经在使用中,那么它就不可能工作。该 dup
-类似行为是FD在另一端可以使用的原因。
只有当FD在两端都匹配的时候,才是巧合。
2) 我不知道内核到底是如何处理ref计数的,但我相信它是被当作一个 dup
操作,所以从一端传递到另一端意味着现在有两个进程打开了文件,这不是任何一种特殊情况。
当一端关闭文件时,refcounts的处理方式和其他任何一种类型的程序一样。dup
状况。