我正在制作一台服务器,该服务器在连接时(使用fork)产生一个子代,并使用管道在另一个连接即将到来时使用管道向该子代发送另一个套接字。这个想法是让子代进程在2个子节点中管理两个连接。玩家网络游戏模式。

父子之间的IPC管道变量为pfd [2]。

基本上,在子进程中,我执行recvmsg(pfd[0], &message, MSG_WAITALL)以等待从父级传递第二个套接字。

但是,recvmsg从未被阻止,并且始终返回-1。

我已经将pfd [0]设置为BLOCKINg,如下所示:

// set to blocking pipe
int oldfl;
oldfl = fcntl(pfd[0], F_GETFL);
if (oldfl == -1) {
    perror("fcntl F_GETFL");
    exit(1);
}
fcntl(pfd[0], F_SETFL, oldfl & ~O_NONBLOCK);


我怎样才能使孩子在recvmsg被阻止?

感谢一百万的任何提示。

最佳答案

recvmsg()不适用于管道,而仅适用于套接字。当recvmsg()返回-1时,您应检查errno值,它可能是EBADF

您可以使用unix sockets而不是管道在进程之间传递文件描述符。

07-26 05:39