我正在制作一个服务器,它在连接时生成一个子进程(使用 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);
我怎样才能让 child 在 recvmsg 时被阻止?
感谢一百万的任何提示。
最佳答案
recvmsg()
不适用于管道,而仅适用于套接字。当 recvmsg()
返回 -1 时,您应该检查 errno
值,它可能是 EBADF
。
您可以使用 unix sockets而不是通过管道在进程之间传递文件描述符。
关于c++ - 问题: recvmsg(pfd[0], &message, MSG_WAITALL) 总是返回-1 而不是被阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5154020/