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

欧舒吉

通过该操作,我希望得到一个错误,因为我什么都没读,但是实际上程序似乎一直在尝试读取,直到有人对其进行写入为止。如果没有写操作,它将被卡在无限循环中尝试读取,并且不会继续。

这里的幕后究竟发生了什么,该功能是否一直在循环,还是在等待信号,还是发生了其他情况?它仍在占用CPU资源吗?

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

内特·艾德雷奇

这是正常现象。如果没有可供读取的内容,则读取过程将一直阻塞,直到有可用的为止。阻塞时不会消耗CPU时间。OS将使它进入睡眠状态,直到另一个进程写入管道。

请记住,管道的设计应有些透明。一个简单的过滤器类型的程序不必关心输入是文件还是管道。如果每个希望能够从管道中读取的程序(认为grep)都必须包含特殊处理以等待编写者准备就绪,那么对于那些程序员而言,这将是非常繁琐的工作。此行为意味着从管道读取不需要执行任何特殊操作。

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当我在Scala中使用全局地图变量而不进行广播时会发生什么

当我在Xcode IDE中“保存”时会发生什么

没有互斥量的情况下同时读取或写入时会发生什么

当我们向GPIO写入0时会发生什么

当我写入随机存储器地址时会发生什么?

当我写入内存映射寄存器时会发生什么?

将千兆字节的数据写入管道时会发生什么?

当我尝试使用进程ID小于-1的kill时会发生什么?

当我们尝试设置当前执行代码的寄存器时会发生什么?

当我们尝试修改字符串常量时会发生什么?

当我们尝试访问数组元素时会发生什么?

当我尝试删除从未添加的处理程序时会发生什么?

当我要求dotMemory强制进行垃圾收集时会发生什么情况

当我在依赖jar的项目中进行更改时会发生什么情况?

当我分配大于字节的值时会发生什么?

当我调用“ BufferStrategy.show()”时会发生什么?

当我使用多个模拟时间时会发生什么?

当我取消订阅 Observable 链时会发生什么?

当我放弃对iOS 6的支持时会发生什么?

当我使用'|'时会发生什么 或'<',c ++

当我多次调用requestAnimationFrame时会发生什么

当我将%esp移至%ebp时会发生什么?

当我忘记登录TTY时会发生什么?

当我截断正在使用的文件时会发生什么?

当我不输入期望的命令时会发生什么?

当我们在Python的类中给出函数定义时会发生什么

当我将Object.assign设置为javascript中的原始类型时会发生什么?

当我在lambda函数中启动新线程并返回时会发生什么

Javascript-当我在数组中创建元素时会发生什么