C 创建了多少个进程

C 创建了多少个进程,c,linux,ubuntu,fork,C,Linux,Ubuntu,Fork,我想知道在这段代码中有多少个进程是从fork()创建的,我做了一些跟踪,最后有20个进程,但我不能确定,你能帮我吗。 多谢各位 #include <stdio.h> #include <sys/types.h> int main() { ** fork(); fork(); if( fork() > 0) { fork(); fork(); } return 0; } #包

我想知道在这段代码中有多少个进程是从fork()创建的,我做了一些跟踪,最后有20个进程,但我不能确定,你能帮我吗。 多谢各位

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

int main()
{
    **
    fork();
    fork();
    if( fork() > 0)
    {
        fork();
        fork();
    }
    return 0;
}
#包括
#包括
int main()
{
**
fork();
fork();
如果(fork()>0)
{
fork();
fork();
}
返回0;
}
“请参阅”在执行每个语句时进程的数量是如何变化的:

/* 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 */

通过在
返回0
之前添加以下行,可以使每个进程打印一个点:

write(STDOUT_FILENO, ".", 1);

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

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

A:  fork();
B:  fork();
C:  if( fork() > 0)
    {
D:      fork();
E:      fork();
    }
    return 0;
让我们构建一个树,显示所有创建的进程以及创建它们的fork标签:

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


在此树中,节点描述了进程,边缘中的标签显示了创建每个子进程的
fork()
调用(例如,proc.1通过fork A创建了proc.2)。如果您对节点进行计数,您将看到它们实际上是20个进程。(很抱歉,我的命名既没有遵循严格的BFS也没有遵循DFS)

为什么20不是一个令人满意的答案,特别是因为您似乎已经验证了这一事实?就在
返回之前,打印pid和父pid。这将告诉您有多少个进程和父/子树。要查看进程之间的关系,请在
返回0之前打印
getpid()
getppid()
的结果评论建议您做什么…也许更好?--<代码>printf(“pid%d,ppid%d\n”,(int)getpid(),(int)getppid()) > pMG,这可能不太健壮,因为现在你必须考虑<代码> StdOut< <代码>缓冲区发生什么,当你<代码> For < /C>时,当它需要刷新时。你用什么来画这个图?我用过。但我不得不在谷歌上搜索,事先并不知道。学习如何使用它并不困难。