我遇到与bash script flush类似的问题,但希望得到确认和澄清:
我有一个基于控制台的交互式perl脚本,可以写入stdout。在此过程中,它使用system()来调用C程序,并且其输出(也是stdout)由脚本进行按摩并输出给用户。
在Windows上没有问题。但是在Linux上,在一个非常具体且非常可重复的实例中,只有程序消息的尾部部分才会到达脚本。发现通过在C程序中添加fflushes,问题就消失了。
编辑:进一步的测试表明,在返回之前的单个fflush已经解决了这个问题,至少对于这个特定的例子。所以这篇文章的这一点现在是社区认为问题正在发生的地方,所以我可以在将来的其他情况下避免它...
是脚本和C程序之间的相互作用,它们都使用stdout吗?或者是perl中的system()创建了一个子shell来执行程序,可能会出现问题吗?
如果前者:fflush是最佳选择?就开销而言,只有一个电话似乎是合理的。
如果是后者,可能会以某种方式使用stdbuf来改变运行程序的子shell的stdout行为,特别是如果它是一个无法重写的程序?
谢谢!
答案 0 :(得分:3)
我已经过测试,发现问题可以通过以下任一方法解决:
一些评论者提到C应该在退出时刷新缓冲区,但CERT漏洞FI023.C特别是关于使用C的stdout中的未刷新数据。当使用perl tickmarks捕获stdout时,我想知道是否& #39;在这种情况下可能发生的一种重定向。