进程挂起读取

时间:2011-11-15 02:52:26

标签: c linux unix process ipc

以下代码通过管道从其他进程读取消息。所有进程都正确地打印出所有消息,但是它们永远不会继续经过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是每个进程的读写结束表。

1 个答案:

答案 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等的手册页。