我正在尝试使用互联网域套接字为聊天应用创建一个小型服务器。服务器由调度程序和主服务器组成。
调度程序负责检测新的连接请求并在新线程中处理它们。该线程通过FIFO将信息发送到主服务器。线程发送的包具有它创建的管道FD,因此主服务器可以与响应进行通信。调度程序由主服务器使用fork初始化,然后使用 execve()。
问题是我无法从服务器向管道写入数据。我收到 [EBADF错误文件描述符] 错误。
我知道我应该将管道FD从父进程传递到子进程,但是这个解决方案对我不起作用,因为我不知道我需要多少管道同时。此外,我不想为每个线程创建一个FIFO,这意味着我需要为每个活动的线程创建一个新文件,我认为这不是一个非常优雅的解决方案。
总结一下:
答案 0 :(得分:2)
如果您使用fork
从主服务器创建调度程序,它将不共享文件描述符表:调度程序最初将获得文件描述符的副本,但调度程序随后打开的任何文件或套接字将只在调度员开放。
要创建调度程序,您应该使用共享文件描述符表的方法。例如,您可以使用pthreads
线程。如果您使用Linux,则可以使用低级clone
函数替换fork
,包括标记中的CLONE_FILES
。
答案 1 :(得分:1)