重定向时父节点的初始输出丢失

时间:2018-03-18 18:51:25

标签: c bash process output-redirect

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

  1. hashgen:这会从输入文件中生成常量。
  2. loopy:执行带有一些文件名的hashgen
  3. 以下是我执行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行丢失。为什么孩子会覆盖父母的输出?

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

1 个答案:

答案 0 :(得分:2)

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

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