C++ 问题:recvmsg(pfd[0],&;message,MSG_WAITALL)总是返回-1而不是被阻止?

C++ 问题:recvmsg(pfd[0],&;message,MSG_WAITALL)总是返回-1而不是被阻止?,c++,unix,pipe,nonblocking,recv,C++,Unix,Pipe,Nonblocking,Recv,我正在制作一个服务器,该服务器在连接时生成一个子节点(使用fork),并在出现另一个连接时使用管道向该子节点发送另一个套接字。其思想是让子进程在两人网络游戏模式下管理两个连接 父级和子级之间的IPC管道变量为pfd[2] 基本上,在子进程中,我执行recvmsg(pfd[0],&message,MSG_WAITALL)以等待从父进程传递第二个套接字 但是,recvmsg从未被阻止,并且总是返回-1 我已经将pfd[0]设置为阻塞,如下所示: // set to blocking pipe int

我正在制作一个服务器,该服务器在连接时生成一个子节点(使用fork),并在出现另一个连接时使用管道向该子节点发送另一个套接字。其思想是让子进程在两人网络游戏模式下管理两个连接

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

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

但是,recvmsg从未被阻止,并且总是返回-1

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

// 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


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

谢谢您的回答。事实上,我尝试了袜子对而不是管道,它的工作原理和预期的一样。