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

时间:2011-03-01 11:41:54

标签: c++ unix pipe nonblocking recv

我正在创建一个服务器,它在连接时生成一个子节点(使用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被阻止?

万分感谢任何提示。

1 个答案:

答案 0 :(得分:1)

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

您可以使用unix sockets代替管道来在进程之间传递文件描述符。