2013-10-01 34 views
11

我相信这会创建24个进程;但是,我需要验证。这些问题经常让我感到困惑。谢谢您的帮助!用这些fork()语句创建了多少个进程?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(void) 
{ 
    pid_t pid = fork(); 
    pid = fork(); 
    pid = fork(); 
    if (pid == 0) 
    { 
    fork(); 
    } 
    fork(); 
    return 0; 
} 
+2

把printf放进去,然后编译并运行它,你就会看到。 –

回答

22

这很容易理解。每调用一次,fork调用就会创建一个额外的进程。该调用在新(子)进程中返回0,并在原始(父)进程中返回子进程标识(非零)。

pid_t pid = fork(); // fork #1 
pid = fork();  // fork #2 
pid = fork();  // fork #3 
if (pid == 0) 
{ 
    fork();   // fork #4 
} 
fork();    // fork #5 
  1. 叉#1创建一个附加过程。你现在有两个进程。
  2. 分叉#2由两个进程执行,创建两个进程,总共四个进程。
  3. 叉#3由四个过程执行,创建四个过程,总共八个过程。其中一半有pid==0,一半有pid != 0
  4. 分叉#4由分叉#3创建的一半进程执行(所以其中四个)。这会创建四个额外的流程。你现在有十二个进程。
  5. 叉#5由剩余的所有十二个进程执行,创建十二个进程;你现在有二十四个。
+7

'fork()'也可能无法返回'-1',所以你可能会说没有比24个进程更多的东西,而不是'完全地'24. – mbaitoff

+2

真棒:D,你应该是一个老师。 – roottraveller

1

你是对的。它是24.在最终的return语句之前编译并运行它w/printf。有24行输出。

2

计算以这种方式:

开始用1(主处理)和用于每个叉使其两次,如果叉不是内部,如果(PID == 0)否则添加当前的1/2处理到当前的进程数。

在您的代码中: 1P 获得了#1 fork()使当前进程数加倍。现在新进程号2P

获得#2 fork()使当前进程数加倍。现在新进程号4P

得到#3 fork()使当前进程数加倍。现在,新的过程的数目8P

GOT#4叉(),但等待它在如果条件是(8 + 4 = 12)p

GOT#5叉(),因此加倍的流程的当前数目。现在新进程数24P

相关问题