2013-10-01 32 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

相關問題