1

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

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

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

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

所以总结一下:

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

2 回答 2

2

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

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

于 2013-10-06T20:00:23.710 回答
1

您只能通过“Unix 域”(本地域,与 IPv4 或 IPv6 相对)套接字在同一台机器上的两个进程之间传输打开的文件描述符。传输的文件描述符的类型可以是任何有效的文件描述符,但传输机制必须是 Unix 域套接字文件描述符sendmsg(),在已经打开文件描述符 recvmsg()的进程和正在访问描述符的进程中使用(尽管所需的大部分信息都隐藏在 的描述中<sys/socket.h>)。

于 2013-10-06T20:37:33.790 回答