异步传递进程之间的文件描述符

时间:2011-12-13 16:33:39

标签: c sockets pipe file-descriptor client-server

我正在实现一个Web服务器,我需要让父进程执行以下操作:

  • fork()新工作进程(池)开头。
  • 永远循环,侦听传入的请求(通过套接字通信)。
  • 将套接字描述符(由accept()函数返回)放入队列。

并且工作进程将执行以下操作:

  • 一旦创建,就会永远循环查看任何传递的套接字描述符的队列。
  • 如果他接受套接字描述符,他会处理请求并相应地为客户服务。

浏览并搜索互联网后,我发现我可以通过UNIX Domain SocketPipes在不同进程之间发送文件描述符。但不幸的是,我只能同步这样做! (我可以一次发送一个fd,我不能把它放在等待队列中)

所以,我的问题是:

  • 如何让父进程将套接字描述符放入等待队列,以便请求处于挂起状态,直到其中一个工作进程完成上一个请求?

2 个答案:

答案 0 :(得分:2)

文件描述符只是整数。它们用于索引由内核维护的每个进程的文件信息表。您不能指望文件描述符“可移植”到其他进程。

如果你在调用fork()之前创建文件,它会(稍微)工作,因为文件描述符表是进程的一部分,因此clone() d当孩子是创建。对于在进程拆分后分配的文件描述符,例如使用accept()获取新套接字时,您无法执行此操作。

更新:似乎有一种方法,使用sendmsg()和AF_UNIX套接字,请参阅here,了解this question中提到的详细信息。我不知道,听起来有点“神奇”,但显然这是一个完善的机制,所以为什么不继续实施呢。

答案 1 :(得分:1)

  1. fd 放在内部队列上(如果需要可以无锁,但可能没有必要)
  2. 在父进程中有一个线程,只是从内部队列中读取 fd ,并通过管道发送
  3. 所有子进程都继承管道的另一端,并在完成当前作业时竞争读取下一个 fd