Perl 缓冲区刷新

Posted

技术标签:

【中文标题】Perl 缓冲区刷新【英文标题】:Perl buffer flushing 【发布时间】:2013-07-17 06:07:56 【问题描述】:

我有两个单独的脚本,我尝试使用诸如 open($fh, '-|', "./monitor 之类的管道机制从另一个脚本(父进程)启动一个脚本(子进程)的执行.pl") 这里的 monitor.pl 是子进程,因此它们都异步同时执行。由于这个原因缓冲区被填满,放置在子进程的while循环内的命令的输出被连续写入管道句柄。所以请建议我刷新缓冲区的机制和适当的位置,这样子进程就不会在缓冲区填满时挂起。

【问题讨论】:

你在读$fh在父进程吗? 是的,在父进程中读取 $fh。请。你能建议我任何机制吗? 那么孩子提供数据的速度比父母读取和处理数据的速度快吗? 可能……不确定………… 好吧,如果是这种情况,那么您需要在父母和孩子之间有一些东西可以缓冲孩子的输出。当然,这只有在某些时期孩子没有产生更少的输出时才有效...... 【参考方案1】:

见IO::Handle。

写入后自动刷新:

$fh->autoflush(1);

手动冲洗:

$fh->flush;

在低于 5.14 的 Perl 版本上,您还需要加载 IO::Handle 模块:

use IO::Handle qw();

【讨论】:

我应该在哪里使用这个语句 $fh->autoflush(1);就在像这样打开管道之后codeopen($fh, '-|', "./monitor.pl"); $fh->自动刷新(1); code 上述机制在我的脚本场景中不起作用。子进程monitor.pl的执行是通过使用来自父进程的管道机制open($fh, '-|', "./monitor.pl") 来启动的。父进程可能会执行几个小时,子进程也必须执行,只要父进程异步执行但子进程在 50 分钟后挂起。我希望只要父进程执行可能需要 2-3 个小时,子进程就应该写入管道句柄。请。建议我任何可以帮助我的机制。提前致谢。 7Srv, open a new topic 与您的后续问题的文本。

以上是关于Perl 缓冲区刷新的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Perl 将输入通过管道传输到 Java 应用程序?

如何在 Perl 中读取和写入大缓冲区到进程 stdin/stdout/stderr?

Perl 中的 OS 页面对齐分配

刷新缓存区方式和刷新内存到磁盘方式总结。

Perl - 从外部进程直接输出到标准输出(避免缓冲)

文件相关函数