【问题标题】:How to find the output of a programme with fork()如何使用 fork() 查找程序的输出
【发布时间】: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
  • 显示的代码只会打印cp 的组合,而不会打印任何ab

标签: c tree fork


【解决方案1】:

在第一次迭代中,C2 C1 将分别给出'c',C3 P 将分别给出'p'。当第二次迭代开始调用 fork() 时,父级的打印缓冲区将被复制给子级。

例如,作为第二次迭代的结果,我们有 5 个“子树”。考虑到具有根 C2(depth = 2) 的子树,从缓冲区中,我们将分别有叶子的 c c c c。同样,从 fork() 中,我们将分别得到叶子的 c c p p。所以实际上这个子树的每一个叶子都会分别给出 cc cc cp cp。

以类似的方式重复这个过程,我们最终会得到 16 'c' 和 16 'p'。

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 2018-01-23
    • 2018-10-31
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多