【问题标题】:How many processes are created创建了多少进程
【发布时间】:2020-02-25 14:27:18
【问题描述】:

我想知道在这段代码中从 fork() 创建了多少进程,我做了一些跟踪,它以 20 个进程结束,但我不能确定,请你帮帮我。 谢谢。

#include <stdio.h> 
#include <sys/types.h>

int main()
{
    **
    fork();
    fork();
    if( fork() > 0)
    {
        fork();
        fork();
    }
    return 0;
}

【问题讨论】:

  • 为什么 20 不是一个令人满意的答案,特别是因为您似乎已经验证了这个事实?
  • 就在return 之前,打印pid 和父pid。这将告诉您有多少进程和父/子树。
  • 要查看进程之间的关系,打印getpid()getppid()before return 0;的结果
  • here is a detailed example cmets 建议您做什么...

标签: c linux ubuntu fork


【解决方案1】:

“查看”每个语句执行时进程的数量如何变化:

/* before */     /* ... */             /* after */
/*      1 */     fork();               /*     2 */
/*      2 */     fork();               /*     4 */
/*      4 */     if (fork() > 0) {     /*     8 (4 go into the if) */
/*      8 */         fork();           /*    12: 4 (outside) + 8 (inside) */
/*     12 */         fork();           /*    20: 4 (outside) + 16 (inside) */
                 }
/*     20 */     /* ... */             /* total processes: 20 */

【讨论】:

    【解决方案2】:

    让我们标记所有创建进程的位置:

    A:  fork();
    B:  fork();
    C:  if( fork() > 0)
        {
    D:      fork();
    E:      fork();
        }
        return 0;
    

    让我们构建一个树,显示所有创建的进程以及创建它们的分叉标签:

    在这棵树中,节点描述了进程,边缘中的标签显示了创建每个子进程的fork() 调用(例如,proc.1 通过 fork A 创建了proc.2)。如果计算节点,您会发现它们实际上是 20 个进程。 (对不起,我的命名既不遵循严格的 BFS 也不遵循 DFS)

    【讨论】:

    • 你用什么来画这张图的?
    • 我用过csacademy.com/app/graph_editor。不得不谷歌搜索它,但事先并不知道。学习如何使用它并不困难。
    【解决方案3】:

    您可以通过在return 0 之前添加以下行来使您的每个进程都打印一个点:

    write(STDOUT_FILENO, ".", 1);
    

    如果你计算点,总共有 20 个进程,其中 1 个是在你启动程序时创建的。

    【讨论】:

    • 也许更好? -- printf("pid %d, ppid %d\n", (int)getpid(), (int)getppid());
    • @pmg 这可能不太健壮,因为现在您必须考虑stdout 缓冲区在fork 以及何时需要刷新时会发生什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多