繁体   English   中英

当我尝试从管道读取而不写入时会发生什么?

[英]What happens when I try to read from a pipe without writing to it?

通过此操作,我预计会出现错误,因为我从无到有读取,但实际上该程序似乎一直在尝试读取,直到有人写入为止。 如果没有写入,它将陷入尝试读取的无限循环中并且不会继续。

这里的幕后到底发生了什么,函数是一直循环,还是在等待信号,或者是其他什么事情? 它还在占用 CPU 资源吗?

此外,是否有可能使程序在尝试读取而不进行任何写入时返回错误代码/打印出某些内容? 我真的不需要这样做,只是想知道是否可能。

这是正常行为。 如果没有可用的读取,读取过程将阻塞,直到有。 阻塞时不会消耗CPU时间; 操作系统会将其置于睡眠状态,直到另一个进程写入管道。

请记住,管道设计得有点透明; 一个简单的过滤器类型的程序不应该关心输入是文件还是管道。 如果每个希望能够从管道中读取的程序(想想grep )都必须包含特殊处理以等待编写器准备就绪,那么对于那些程序员来说,这将是非常乏味的。 这种行为意味着从管道读取不需要做任何特殊的事情。

如果您不想在没有数据可用时阻塞,您可以在文件描述符上设置O_NONBLOCK状态标志,无论是在您open(2)时,还是使用fcntl(fd, F_SETFL, ...) 在这种情况下,当没有数据可用时, read(2)将返回-1并将errnoEAGAINEWOULDBLOCK 这当然意味着,每次从文件描述符读取时,都必须编写代码来处理这种情况。

您还可以使用select(2)poll(2)等待数据可用,可选择超时。

也可以安排它,以便在阻塞期间到达的信号将导致read(2)返回-1并将errnoEINTR 这取决于系统调用重新启动语义,并且有点复杂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM