gpt4 book ai didi

c - 如何查看管道是否为空

转载 作者:太空狗 更新时间:2023-10-29 16:44:00 28 4
gpt4 key购买 nike

假设有一个管道,

int pipe_fd[2];
pipe(pipe_fd);

我们 fork ,并期望一个进程在任意时间写入管道。在其中一个进程中,我们希望能够在不阻塞的情况下检查管道的内容。

即如果什么都不存在并且写入端保持打开状态,则典型的读取将阻塞。我想去做其他事情,甚至可能一次读一点,做一些事情,然后再回来查看是否还有更多内容,la:

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
}

最佳答案

您的逻辑是错误的,因为 read 在用完字符时不会返回 0;相反,它将阻塞直到它接收到更多,除非你将文件置于非阻塞模式,但随后它将返回 -1 并将 errno 设置为 EWOULDBLOCKEAGAIN 而不是返回 0。read 唯一可以 ever 返回 0 的时间是当 size 参数为 0 或已到达文件末尾时。并且,对于管道,文件结束意味着管道的写入端已经关闭;文件结束状态不会仅仅因为还没有任何可用的输入而出现。

话虽如此,最简单的检查方法是:

if (poll(&(struct pollfd){ .fd = fd, .events = POLLIN }, 1, 0)==1) {
/* data available */
}

但除非您使用非阻塞模式,否则您需要在每次读取操作之前进行此检查。将更大的缓冲区传递给 read 而不是一次一个字节地执行它会消除大部分检查成本。

关于c - 如何查看管道是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13811614/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com