Perl 与管道通信时,是否需要使用自动冲洗?
这有可能是一个过于宽泛/主观的问题,因此我将尽量使其具体化 我目前正在学习如何正确使用管道。在使用Perl 与管道通信时,是否需要使用自动冲洗?,perl,Perl,这有可能是一个过于宽泛/主观的问题,因此我将尽量使其具体化 我目前正在学习如何正确使用管道。在使用pipe(我的$pipe\u阅读器,我的$pipe\u编写器)创建管道之后,我经常在代码中查看这些代码,有人会调用$pipe\u writer->autoflush(1) 这不是“无论何时使用管道”的要求,对吗?当您想确保读卡器在写入数据后立即获取数据时,您会使用它吗 正确。如果不启用“自动刷新”,所有操作都会正常工作,只是写入缓冲区只有在填满时或关闭管道时才会刷新,而不是在每次写入时立即刷新。如果
pipe(我的$pipe\u阅读器,我的$pipe\u编写器)创建管道之后,我经常在代码中查看这些代码代码>,有人会调用$pipe\u writer->autoflush(1)代码>
这不是“无论何时使用管道”的要求,对吗?当您想确保读卡器在写入数据后立即获取数据时,您会使用它吗 正确。如果不启用“自动刷新”,所有操作都会正常工作,只是写入缓冲区只有在填满时或关闭管道时才会刷新,而不是在每次写入时立即刷新。如果您通过管道发送大量数据,则可以将其关闭;如果你正在做任何“互动”的事情,那么你可能想要它
特别是,如果向子进程写入和读取数据,缓冲很容易导致死锁情况,如下所示:向子进程发送请求,然后从中读取响应。如果没有缓冲,这一切正常。但使用缓冲时,子对象看不到请求,因为它仍在输出缓冲区中等待,因此它不会生成响应,因此您的读取永远不会取消阻止,也不会发生任何事情。启用自动刷新,或在每次完成请求后切换到读取之前手动刷新,可以避免此问题
您还可以通过使用syswrite
避免输出缓冲,但不要将syswrite
和print
混合使用;由于syswrite
绕过了print
的缓冲区,因此最终输出的顺序可能与预期的不同 使用syswrite
以独占方式写入管道也会绕过缓冲I/O,使autoflush
变得不必要。尝试写入完整管道缓冲区时也可能发生死锁。看见