【发布时间】:2012-11-28 11:53:59
【问题描述】:
假设一个管道,
int pipe_fd[2];
pipe(pipe_fd);
我们分叉,并期望一个进程将在任意时间写入管道。在其中一个过程中,我们希望能够在不阻塞的情况下检查管道的内容。
即如果没有任何内容并且写入端保持打开状态,则典型的读取将阻塞。我想去做其他的事情,甚至可能一次读一点,做一些事情,然后再回来看看是否还有更多,唉:
close(pipe_fd[1]);
while(1){
if(/**Check pipe contents**/){
int present_chars = 0;
while( read(pipe_fd[0],&buffer[present_chars],1) != 0)
++present_chars;
//do something
}
else
//do something else
}
【问题讨论】:
-
由于
pipe()函数不允许你设置非阻塞模式,你必须在使用fcntl()和F_GETFL和F_SETFL加上@987654329创建管道之后这样做@. -
注意Linux也有
pipe2函数,允许你在创建管道的同时请求非阻塞模式。这个函数还不是标准的,但已经被接受包含在下一个版本的 POSIX 中,因为在创建管道的同时原子地设置 close-on-exec 标志也是必要的。 -
@R.. 还没有标准化..
-
@snr: 下一期还没有发布。接受的文本在错误跟踪器中:austingroupbugs.net/view.php?id=411