进程挂起读取

sj7*_*755 3 c unix linux ipc process

以下代码通过管道从其他进程读取消息.所有进程都正确地打印出所有消息,但是它们永远不会继续经过while循环.尝试在Eclipse中进行调试,在阅读完所有消息之后,它将在while循环中停止.

索引是分配给每个进程的编号.第一个进程的索引== 0.消息本身就是发送消息的进程的索引.

while((n = read(fd[index][0], &mymsg, sizeof(int))) == sizeof(int))
        printf("process%d  has received a message from process%d\n", index, mymsg);
Run Code Online (Sandbox Code Playgroud)

有什么想法会发生这种情况吗?

以下是每个进程写入另一个进程的方式:

// Write to other process
if(write(fd[index2][1], &index, sizeof(int)) != sizeof(int))
    sys_error(2);
Run Code Online (Sandbox Code Playgroud)

这样做了五次.fd是每个进程的读写结束表.

kby*_*yrd 6

呼叫将read()阻塞,直到出现更多数据.从管道手册页

如果进程尝试从空管道读取,则read(2)将阻塞,直到数据可用.如果进程尝试写入完整管道(见下文),则写入(2)块,直到从管道读取足够的数据以允许写入完成.通过使用fcntl(2)F_SETFL操作来启用O_NONBLOCK打开文件状态标志,可以实现非阻塞I/O.

在输入while循环之前打开每个文件描述符之后,对每个文件描述符执行以下操作:

fcntl(fd, F_SETFL, O_NONBLOCK);
Run Code Online (Sandbox Code Playgroud)

但是,您真的应该阅读阻塞与非阻塞I/O,包括读取管道,读取,fcntl等的手册页.