进程之间传递文件描述符 "是如何工作的?

问题描述 投票:1回答:1

我读了Stevens关于在进程间传递描述符的例子。总结一下,他的主程序分叉了一个子程序,这个子程序执行另一个程序,这个子程序打开一个文件,把整数的文件描述符传给他。fd 通过unix域套接字返回给父节点并退出。母体收到这个 fd 从套接字中读取文件,并直接用 fd.

有两个问题。

  1. 父进程和子进程是两个独立的进程,因此除非它们共享文件描述符表(默认情况下不是这样的)。fork 行为,因为 CLONE_FILES 没有被设置,AFAIK),父母就不能使用 fd 直接从子代中调用。父母需要在其描述符数组中找到一个槽,并将其映射到 file 的对象。Stevens提到了这个问题,但代码似乎没有在接收端做这个映射。
  2. file 如果子程序没有增加refcount,那么子程序制造的对象将在进程退出时被释放。同样的,Stevens在代码前的描述中提到了这一点,但代码本身似乎并没有这样做。

我发现了一个相关的 所以职位,其中父母和子女的角色是相反的,否则就和史蒂文斯的例子一样。也不知道那个怎么用。

我是不是漏掉了什么?我的猜测是基于Linux的,也许unix与之不同,这两个问题在某种程度上是由内核处理的?感谢帮助!

c linux-kernel file-descriptor unix-socket
1个回答
2
投票

展开全部答案。

1) 当你在UNIX域套接字上传递一个文件描述符时,消息结构--其中包括 SCM_RIGHTS 吩咐 内核 当文件描述符通过套接字时,在飞行中复制文件描述符,在另一端神奇地出现FD值作为下一个可用的插槽。

正如你在问题中提出的那样,如果FD是按字面意思传递的("嘿,另一端,这里有FD#3,可以做一些事情,祝你好运"),而且FD已经在使用中,那么它就不可能工作。该 dup-类似行为是FD在另一端可以使用的原因。

只有当FD在两端都匹配的时候,才是巧合。

2) 我不知道内核到底是如何处理ref计数的,但我相信它是被当作一个 dup 操作,所以从一端传递到另一端意味着现在有两个进程打开了文件,这不是任何一种特殊情况。

当一端关闭文件时,refcounts的处理方式和其他任何一种类型的程序一样。dup 状况。

© www.soinside.com 2019 - 2024. All rights reserved.