通过此操作,我希望得到一个错误,因为我什么都没读,但实际上程序似乎一直在尝试读取,直到有人对其进行写入为止。如果没有写入,它将陷入无限循环中尝试读取,并且将无法继续。
在这里,幕后到底发生了什么,该功能是否一直在循环,或者它是否在等待信号,或者是否还在发生其他情况?还在占用CPU资源吗?
此外,是否可以使程序在尝试读取而没有任何写操作时返回错误代码/打印出某些内容?我真的不需要这样做,只是想知道是否有可能。
答案 0 :(得分:2)
这是正常现象。如果没有可供读取的内容,则读取过程将一直阻塞,直到有可用的为止。阻塞时不会消耗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
。这取决于系统调用重新启动的语义,并且有点复杂。