Perl system()需要stdout flush

时间:2018-02-09 19:34:11

标签: c linux perl stdout flush

我遇到与bash script flush类似的问题,但希望得到确认和澄清:

我有一个基于控制台的交互式perl脚本,可以写入stdout。在此过程中,它使用system()来调用C程序,并且其输出(也是stdout)由脚本进行按摩并输出给用户。

在Windows上没有问题。但是在Linux上,在一个非常具体且非常可重复的实例中,只有程序消息的尾部部分才会到达脚本。发现通过在C程序中添加fflushes,问题就消失了。

编辑:进一步的测试表明,在返回之前的单个fflush已经解决了这个问题,至少对于这个特定的例子。所以这篇文章的这一点现在是社区认为问题正在发生的地方,所以我可以在将来的其他情况下避免它...

是脚本和C程序之间的相互作用,它们都使用stdout吗?或者是perl中的system()创建了一个子shell来执行程序,可能会出现问题吗?

如果前者:fflush是最佳选择?就开销而言,只有一个电话似乎是合理的。

如果是后者,可能会以某种方式使用stdbuf来改变运行程序的子shell的stdout行为,特别是如果它是一个无法重写的程序?

谢谢!

1 个答案:

答案 0 :(得分:3)

我已经过测试,发现问题可以通过以下任一方法解决:

  1. 在C程序结束时添加fflush。
  2. 运行C程序而不用fflush使用(在perl中)`stdbuf -oL myprog`(之前我错误地引用了system(),抱歉)。
  3. 一些评论者提到C应该在退出时刷新缓冲区,但CERT漏洞FI023.C特别是关于使用C的stdout中的未刷新数据。当使用perl tickmarks捕获stdout时,我想知道是否& #39;在这种情况下可能发生的一种重定向。