c - 如何将套接字从父进程传递给子进程

标签 c sockets webserver fork file-descriptor

我在 Linux 上的 C 程序中遇到了问题。

我知道当一个进程被 fork 时,子进程会从父进程继承一些东西,包括打开文件描述符。

问题是我正在编写一个多进程服务器应用程序,其主进程接受新连接并将描述符放入共享内存。

当子进程试图从共享内存中读取这些描述符之一时,在 select() 上我得到了一个 EBADF 错误!

子进程如何读取和使用由父进程创建的套接字(或一般的任何文件描述符)?

最佳答案

当您调用 fork 时,子进程会继承所有打开的文件描述符的副本。这样做的典型方法是父进程打开一个监听套接字,调用 accept 阻塞直到连接到达,然后在接收到连接后调用 fork。然后父进程关闭它的文件描述符副本,而新的子进程可以继续使用文件描述符并进行任何需要的处理。一旦子进程完成,它也会关闭套接字。记住两件事很重要: 1. 文件描述符/套接字是操作系统中的一种资源,在 fork 之后,父进程和子进程各自拥有该资源的句柄,这有点像引用计数智能指针。我解释这个in more detail here .第二件事是只有在调用 fork 之前打开的文件描述符是共享的,因为在 fork 之后父进程和子进程是完全独立的进程,即使它们可能共享一些资源,比如在调用 fork 之前就存在的文件描述符叉。如果您使用的模型希望父进程将工作分配给工作进程,那么您最好考虑使用线程,并且 a thread pool .

顺便说一句,你可以从Unix Network Programming下载很多不错的服务器和客户端示例。网站。

关于c - 如何将套接字从父进程传递给子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14427898/

相关文章:

c - 如何解决 "subscripted value is neither array nor pointer nor vector"

c - C中这两个有什么区别?

ios - 创建一个通过 Swift 3 (iOS) 中的套接字接收数据的 InputStream

java - Android应用程序通过套接字与服务器通信

performance - Web 服务器基准测试的简单工具?

c - Shell 脚本 vs C 性能

c++ - 图书馆如何实现不同操作系统之间的可移植性

php - fsockopen php性能

ruby-on-rails - 通过Ruby on Rails使用wget

linux - 在本地桌面计算机上替换 someaddress.com