[英]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
并将errno
为EAGAIN
或EWOULDBLOCK
。 这当然意味着,每次从文件描述符读取时,都必须编写代码来处理这种情况。
您还可以使用select(2)
或poll(2)
等待数据可用,可选择超时。
也可以安排它,以便在阻塞期间到达的信号将导致read(2)
返回-1
并将errno
为EINTR
。 这取决于系统调用重新启动语义,并且有点复杂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.