为什么我们不能接受()一些进程上的套接字和来自其子进程的recv()数据?

Eng*_*uad 2 c sockets linux process

我正在尝试在Linux上实现一个连接到客户端(浏览器)的简单Web服务器,从客户端接收一些请求(例如GET),然后用所需文件发回响应.我正在使用套接字通信.我想在服务器启动时创建一个工作进程池(子进程),其工作是处理传入的请求.父进程必须处理accept()传入请求,并将其文件解析器发送到其中一个工作进程以处理它,并将响应发送到具有所请求文件的客户端.

我遇到的问题是,当我accept()发出请求并将其发送到工作进程时,recv()或者read()函数返回-1意味着发生错误:

非套接字上的套接字操作

但是当我尝试在父进程中使用recv()read()运行时,它们工作得非常好并返回接收的字节数.

我该如何解决这个问题?

PS:我正在使用共享内存将文件解析器从父进程传递到工作进程(子进程),我使用信号量来管理哪个工作进程将处理请求


编辑:

实际上,它是一个项目赋值,其中一个规范是通过共享内存发送文件描述符.但是,我可以发送文件描述符的指针吗?

cni*_*tar 5

您无法通过共享内存AFAIK发送文件描述符.所以你所做的实际上是向工作进程发送一个小整数.

可以做的是,使用sendmsg和辅助数据通过Unix域套接字发送文件描述符.这听起来有点像魔术(哎呀,这一个有点像魔术),但它的Unix之间的非常标准,所以应该工作.