parent 的初始输出在重定向时丢失
Initial output of parent is lost while redirecting
我尝试编写的程序应该定义一些常量 (C macro/constants)。所以我写了两个C程序:
hashgen
:这从输入文件生成常量。
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)
我尝试编写的程序应该定义一些常量 (C macro/constants)。所以我写了两个C程序:
hashgen
:这从输入文件生成常量。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)