C - 通过FIFO将在线程中创建的PIPE FD发送到父进程

时间:2013-10-06 19:43:35

标签: c multithreading sockets unix

我正在尝试使用互联网域套接字为聊天应用创建一个小型服务器。服务器由调度程序和主服务器组成。

调度程序负责检测新的连接请求并在新线程中处理它们。该线程通过FIFO将信息发送到主服务器。线程发送的包具有它创建的管道FD,因此主服务器可以与响应进行通信。调度程序由主服务器使用fork初始化,然后使用 execve()

问题是我无法从服务器向管道写入数据。我收到 [EBADF错误文件描述符] 错误。

我知道我应该将管道FD从父进程传递到子进程,但是这个解决方案对我不起作用,因为我不知道我需要多少管道同时。此外,我不想为每个线程创建一个FIFO,这意味着我需要为每个活动的线程创建一个新文件,我认为这不是一个非常优雅的解决方案。

总结一下:

  • 是否可以这种方式使用管道?
  • 如果问题在于 使用管道,为什么我不能通过FIFO传递管道FD并使用 它在另一个过程中?我读到可以沟通 使用UNIX域套接字在管道不相关的进程之间 通过FD。这些方法有什么区别?
  • 您会推荐什么解决方案?

2 个答案:

答案 0 :(得分:2)

如果您使用fork从主服务器创建调度程序,它将不共享文件描述符表:调度程序最初将获得文件描述符的副本,但调度程序随后打开的任何文件或套接字将只在调度员开放。

要创建调度程序,您应该使用共享文件描述符表的方法。例如,您可以使用pthreads线程。如果您使用Linux,则可以使用低级clone函数替换fork,包括标记中的CLONE_FILES

答案 1 :(得分:1)

您只能通过“Unix域”(本地域,而不是IPv4或IPv6)套接字在同一台计算机上的两个进程之间传输打开的文件描述符。传输的文件描述符的类型可以是任何有效的文件描述符,但传输机制必须是在已经打开文件描述符的过程中使用sendmsg()的Unix域套接字文件描述符。 {(3}}正在获取对描述符的访问权限的过程中(尽管所需的大部分信息都隐藏在recvmsg()的描述中)。