parent 的初始输出在重定向时丢失

Initial output of parent is lost while redirecting

我尝试编写的程序应该定义一些常量 (C macro/constants)。所以我写了两个C程序:

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

我是这样执行的 loopy:

./loopy *.txt >> constants.h

循环代码片段如下

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 行。为什么 children 会覆盖 parent 的输出?

我同意有更好的方法,但当时确实需要这样做。现在我想知道为什么会这样。 :)

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

一个解决方案是在调用执行 I/O.

的外部程序之前使用 fflush(stdout)