【发布时间】:2020-10-01 15:23:58
【问题描述】:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, const char * argv[]) {
for(int i = 0; i < 2; i++){
if(fork() == 0){
fork();
printf("c");
}
else{
fork();
printf("p");
}
}
}
我想计算 p 和 c 分别打印多少次,这是我的工作。
为 i == 0 绘制进程树:
P
/ \
C1 P
/ \ / \
C2 C1 C3 P
我称之为子树。在一个子树中,P 给出 p,C3 给出 c,C1 给出 p,C2 给出 c。在第二次迭代中,每个叶子都会像这样拥有一个子树,所以最终我们总共会有 5 个子树。由于一个子树给出 2 p, 2 c,5 个子树将给出 10 p, 10 c。但这是错误的。
出了什么问题?
更新: 我发现我犯了一个错误,这里是更正:P给p,C3给p,C1给c,C2给c。
【问题讨论】:
-
但这是错误的 - 怎么错了?
-
无论如何,由于输出缓冲区的重复,您可能会得到一些误导性的结果。
-
@EugeneSh.对不起,我犯了一个错误,它已更新如上所示。无论如何,按照我的想法,我最终得到了 10 p 和 10 c,但是根据我在在线编译器上运行程序得到的结果,16 p 和 16 c 将是正确的答案。而且我不明白我们怎么会有这么多输出
-
正如我所说,当一个进程正在打印一些输出时,它不一定会直接进入控制台,它可能会被缓冲在属于同一进程的输出缓冲区中。当一个进程被分叉时,这个缓冲区会被复制。所以这两个过程最终都会打印出来。有关详细信息和可能的解决方案,请参阅stackoverflow.com/questions/2530663/printf-anomaly-after-fork
-
显示的代码只会打印
c和p的组合,而不会打印任何a或b。