首页 > 解决方案 > 嵌套fork()——如何统计进程数

问题描述

我对 Fork() 的这个例子感到困惑

int main(){
   if (fork()){
     if (!fork()) 
       fork();
   }
   fork();
   printif("1 ");
}

我数了数,会是 12 个重复的(会有多少进程!!!)

标签: cunixfork

解决方案


让他们数一数:

int main(){
   if (fork()){          // 1
     if (!fork())        // 2
       fork();           // 3
   }
   fork();               // 4
   printif("1 ");          
}

当您运行该程序时,您将拥有第一个进程,它将成为所有其他进程的祖先。

fork_1将创建一个子进程,后者将有 0 作为返回值。所以它会在 if 语句之后继续,然后运行fork_4,因此创建了另一个孩子。 printf现在运行两次 (2)。

让我们继续第一个获得非空值的进程,它运行fork_2然后获得非空返回值。它在第二个 if 语句之后继续运行fork_4。将有两个进程(祖先及其子进程)=> 另外两个printf

中创建的子进程fork_2会得到一个空返回值,所以if条件为真。它运行fork_3提供两个进程,每个进程都运行fork_4。因此 printf 将运行四 (4) 次。

最后, printf 运行 8 次。所以你会得到八个1打印。


推荐阅读