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

标签 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);

我怎样才能让 child 在 recvmsg 时被阻止?

感谢一百万的任何提示。

最佳答案

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

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

关于c++ - 问题: recvmsg(pfd[0], &message, MSG_WAITALL) 总是返回-1 而不是被阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5154020/

相关文章:

c++ - 在 C++ 中创建一个类对象

c++ - boost 正则表达式不匹配 "\\s"到空格

c - sysctl() 的参数是什么?

unix - 当输入按数字排序时加入省略输出行

linux - 结合ccze和grep?

go - 向 exec.Cmd.StdinPipe() 写入超过 4K 字节

c++ - 如何声明在不同文件中定义的类类型的成员

java - ndk-build 'JNI_CreateJavaVM' 未在此范围内声明

c - UNIX 信号处理。在 SIGCHLD 处理程序中等待。 C

c - 在我自己的简单 shell 中进行管道传输和重定向