与管道通信时,是否需要使用AUTOFLUSH?

时间:2018-02-02 21:56:18

标签: perl

这有可能成为一个过于宽泛/主观的问题,所以我会尝试尽可能具体。

我目前正在学习如何正确使用烟斗。通常在我已审核过的代码中,在使用pipe(my $pipe_reader, my $pipe_writer);创建管道后,有人会调用$pipe_writer->autoflush(1);

这并不是要求使用"无论何时使用管道",对吗?当你想确保读者在写入后立即获取数据时,你会使用它吗?

1 个答案:

答案 0 :(得分:6)

正确。如果你没有打开autoflush,一切都会正常工作,除了写缓冲区只在它填满时,或者当你关闭管道时,而不是在每次写入时立即刷新。如果您通过管道发送批量数据,那么您可以将其关闭;如果你正在做任何“互动”的事情,那么你可能想要它。

特别是,如果您正在写入从子进程读取的,则缓冲很容易导致死锁情况,如下所示:您向子进程发送请求,并且然后阅读它的回复。没有缓冲,这没关系。但是通过缓冲,孩子看不到请求,因为它仍在输出缓冲区中等待,因此它不会产生响应,因此您的读取永远不会解除阻塞,并且什么都不会发生。在切换到读取之前启用autoflush或在每个完整请求之后进行手动刷新可以避免此问题。

您还可以使用syswrite来避免输出缓冲,但不要混用syswriteprint;由于syswrite绕过print的缓冲区,您最终可能会以与预期不同的顺序输出输出!