2011-11-15 227 views
1

我正在读取来自管道的未知数量的消息。但是,读取被阻止。我试过下面的代码将读取设置为非阻塞。但是,这会导致读取错误和进程无法读取。从管道读取阻塞

// Set pipe to non-blocking 
sleep(5); 
fcntl(fd[index][0], F_SETFL, O_NONBLOCK); 

如何在不挂起程序的情况下成功读取和打印所有消息? 以下是导致问题的代码:

// Read every message 
while((n = read(fd[index][0], &mymsg, sizeof(int))) == sizeof(int)) 
    printf("process%d has received a message from process%d\n", index, mymsg); 
+0

阅读有关select,poll和epoll的文档。 –

+0

你会得到什么错误?无阻塞的套接字在没有任何内容需要读取时总会返回“读取错误”。 –

+0

@ZanLynx这是正确的。当有足够的流程启动时。几个进程将退出并出现读取错误。 – sj755

回答

1

使用select()或epoll()。这是在没有多线程的情况下实现非阻塞读取(或写入)的标准方式。

+0

你能举个例子来说明我的情况吗? – sj755

+0

阅读select()中的数百个教程之一。 –