我正在创建一个服务器,它在连接时生成一个子节点(使用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被阻止?
万分感谢任何提示。
答案 0 :(得分:1)
recvmsg()
不适用于管道,而只适用于套接字。当recvmsg()
返回-1时,您应该检查errno
值,它可能是EBADF
。
您可以使用unix sockets代替管道来在进程之间传递文件描述符。