2011-11-15 87 views
3

以下代码通过管道读取来自其他进程的消息。所有进程都能正确打印出所有的消息,但是它们将永远不会经过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); 

任何想法为什么会发生这种情况?

下面是每个过程是如何写入另一个:

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

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

+0

目前尚不清楚为什么这不是你期望的行为。代码应该在什么情况下通过while循环? –

+0

@DavidSchwartz如果它读入没有字节或返回错误。 – sj755

+0

你有什么特别的理由可以期待这些事情发生吗?如果不是,那么为什么它应该退出while循环? (文件描述符是否非阻塞?) –

回答

5

read()的呼叫被阻止,直到出现更多数据。从man page for pipe

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

后您输入while循环这样做是为了每一个前打开每个文件描述:

fcntl(fd, F_SETFL, O_NONBLOCK); 

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

+0

我可以有一些示例代码?我对这个功能不太熟悉。 – sj755

+0

@ seljuq70:您是否尝试过fctntl手册页?我刚刚在Google中输入了'fcntl F_SETFL O_NONBLOCK',并获得了一些带有示例代码的点击。无论如何,我编辑我的答案以添加更多信息。 – kbyrd

+0

我在读之前试过这个:fcntl(fd [index] [0],F_SETFL,O_NONBLOCK);由于某些原因,进程0不再打印任何东西? – sj755