Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 与管道通信时,是否需要使用自动冲洗?_Perl - Fatal编程技术网

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
变得不必要。尝试写入完整管道缓冲区时也可能发生死锁。看见