以下代码通过管道从其他进程读取消息。所有进程都正确地打印出所有消息,但是它们永远不会继续经过while循环。尝试在Eclipse中进行调试,在阅读完所有消息之后,它将在循环时停止。
索引是分配给每个进程的编号。第一个进程的索引== 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);
为什么会发生这种情况的任何想法?
以下是每个进程写入另一个进程的方式:
// Write to other process
if(write(fd[index2][1], &index, sizeof(int)) != sizeof(int))
sys_error(2);
这样做了五次。 fd是每个进程的读写结束表。
答案 0 :(得分:6)
对read()
的调用阻塞,直到出现更多数据。来自man page for pipe
如果进程尝试从空管读取,则读(2)将 阻止,直到数据可用。如果进程尝试写入 完整管道(见下文),然后写入(2)块,直到有足够的数据 已从管道中读取以允许写入完成。非阻塞 通过使用fcntl(2)F_SETFL操作来启用I / O. O_NONBLOCK打开文件状态标志。
在输入while循环之前打开每个文件描述符之后,对每一个执行此操作:
fcntl(fd, F_SETFL, O_NONBLOCK);
但是,您真的应该阅读阻塞与非阻塞I / O,包括读取管道,读取,fcntl等的手册页。