【发布时间】:2015-11-05 20:09:44
【问题描述】:
朋友给我发了一个程序:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
void chain(int n, int current_nr) {
printf("Running %d\n", current_nr);
pid_t pid = fork();
if (pid != 0) { //parent
return;
}
else { //child
if (current_nr == n - 2) {
return;
}
else {
chain(n, current_nr + 1);
}
}
}
int main(void) {
puts("Program started");
chain(5, 0);
wait(NULL);
return 0;
}
如果程序以 ./program 执行,则输出为:
Program started
Running 0
Running 1
Running 2
Running 3
但是作为 ./program > outputfile 执行后,输出文件内容为:
Program started
Running 0
Running 1
Running 2
Running 3
Program started
Running 0
Running 1
Running 2
Running 3
Program started
Running 0
Running 1
Running 2
Program started
Running 0
Running 1
Program started
Running 0
发生了什么事?
【问题讨论】:
-
我认为这与
fork复制文件描述符并且输出被缓冲的事实有关...... -
父母和孩子都调用
exit(隐含从main返回)。这意味着父母必须完成的任何“流程结束”活动两次。完成后,您应该在孩子中调用_exit以避免这种情况。 -
这个程序很好地演示了
FILE*缓冲在你做fork()时是如何工作的。
标签: c linux concurrency fork