【问题标题】:Initial output of parent is lost while redirecting重定向时父级的初始输出丢失
【发布时间】:2018-03-18 18:51:24
【问题描述】:

我试图编写的程序应该定义一些常量(C 宏/常量)。于是我写了两个C程序:

  1. hashgen :这会从输入文件生成常量。
  2. loopy :这会执行带有一些文件名的 hashgen

这是我执行loopy的方式:

./loopy *.txt >> constants.h

下面是循环代码sn-p

int main(int argc, char** argv) {
    char buf[256];
    puts("#ifndef CONSTS_DEFINED\n#define CONSTS_DEFINED");
    while(--argc > 0) {
         sprintf(buf, "./hashgen %s", argv[argc]);
         system(buf);
    }
    puts("#endif");
    return 0;
}

执行上述脚本后,#ifndef .... 行丢失,而#endif 行存在。为什么孩子会覆盖父母的输出?

我同意有更好的方法来解决这个问题,但当时需要这样做。现在我想知道为什么会这样。 :)

【问题讨论】:

  • 我无法确认这种行为,我创建了一个虚拟的 hashgen 脚本 (echo $@),其输出与参数相同,我可以看到所有内容。顺便说一句,最后一个puts 缺少一个分号。
  • 上面真的是你运行的代码吗?最后一个 puts 后面缺少一个分号。
  • 或许你也可以给我们看看hashgen的代码
  • 伙计们,问题是关于代码的行为。我没有粘贴文件,因为它很大。实际程序正在运行。屏幕上的输出验证了这两个程序的正确行为。我们缺少与 bash 如何处理此重定向相关的内容
  • 所以你说没有重定向你会看到所有的行?只有在执行附加重定向>> 时它们才不会出现?我测试了这两种情况,两种情况的行为相同。

标签: c bash process output-redirect


【解决方案1】:

puts 的输出不会直接发送到文件,而是发送到内部缓冲区。因此,当调用外部程序时,还没有输出任何内容。程序输出它的东西,然后主程序继续,当它完成时,它的 stdio 缓冲区被刷新,你的指令最终结束。这也出现在普通重定向中,而不仅仅是追加。

一种解决方案是在调用执行 I/O 的外部程序之前使用 fflush(stdout)。

【讨论】:

  • 糟糕!非常感谢你。有很多常量,我看不到最后一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
相关资源
最近更新 更多