这有可能是一个过于宽泛/主观的问题,所以我将尽量具体。
我目前正在学习如何正确地使用管道。在我经常查看的代码中,使用pipe(my $pipe_reader, my $pipe_writer);创建管道后,会有人调用$pipe_writer->autoflush(1);。
这不是使用“无论何时使用管道”的要求,对吗?当您想确保读者在作者写完数据后立即获得数据时,您就会使用它吗?
发布于 2018-02-02 22:04:42
对,是这样。如果不打开自动刷新,一切都会正常工作,除了写缓冲区只有在填满或关闭管道时才会刷新,而不是在每次写入时立即刷新。如果您要在管道上发送大量数据,那么您可以关闭它;如果您正在执行任何“交互式”操作,那么您可能希望打开它。
特别是,如果您正在写入子进程并从子进程读取数据,那么缓冲很容易导致死锁情况,如下所示:向子进程发送请求,然后从其子进程读取响应。不用缓冲,就可以了。但是通过缓冲,子程序不会看到请求,因为它仍然在输出缓冲区中等待,因此它不会产生响应,所以您的read永远不会打开块,也不会发生任何事情。在切换到阅读之前,启用自动刷新,或者在每个完整请求之后进行手动刷新,都可以避免这个问题。
您也可以通过使用syswrite来避免输出缓冲,但是不要将syswrite和print混为一谈;因为syswrite绕过了print的缓冲区,所以最终输出的顺序可能与您预期的不同!
https://stackoverflow.com/questions/48591415
复制相似问题