我正在用Ubuntu编写一个c程序,并且在代码中我使用fork()来生成5个不同的子代。但是,当我编译和运行我的程序时,没有创建子程序,并且我放在三个if语句(对于case fork() == 0,> 0,< 0)中的printf("Test")只在>0中,在printf语句的输出中。
实际上,不久前,fork()运行得还不错,但在我继续我的程序工作后,它突然不能工作了。
为什么会发生这种情况?我应该如何修复它?
for (i = 0; i < proc; ++i){
printf("In for %d",i);
// TODO
int fork_result = fork();
if (fork_result == 0){ // Create child process
child_pids[i] = getpid();
printf("Test 5");
printf("In if %d",i);
break;
}
else if(fork_result < 0){
printf("Fork failed");
}
else if (fork_result > 0){
printf("Parent");
}
}
那么,预期的结果是它将包含“测试5”或"In if“
实际输出:
In for 0In for 1In for 2In for 3In for 4
实际输出不包含任何“测试5”
发布于 2019-03-28 03:44:03
子进程继续执行调用者的代码。调用方很可能不希望执行父级和所有子级。在此之前,您应该退出该子进程:
for (i = 0; i < proc; ++i){
printf("In for %d",i);
fflush(stdout); // <--- here
// TODO
int fork_result = fork();
if (fork_result == 0){ // Create child process
child_pids[i] = getpid();
printf("Test 5");
printf("In if %d",i);
exit(0); // <---- must have this
break;
}
else if(fork_result < 0){
printf("Fork failed");
}
else if (fork_result > 0){
printf("Parent");
}
}
// without the exit above the child will execute this code:
Some code
您必须刷新stdout,否则子进程和父进程共享缓冲区中相同的前缀文本,并且当最后刷新时,两者都将打印相同的前缀。最终,这种分享会让任何试图分析输出的人感到困惑。
注意:一旦有exit
调用,标准输出将被正确刷新。
另外,请注意,不同的打印输出可能是交错的。将它们放在不同的行中,并使用不同的前缀(如i
和/或pid)可以帮助调试。
https://stackoverflow.com/questions/55383409
复制相似问题