2013-01-02 70 views
3

這是我的代碼:如何fork()n子進程執行不同的功能?

for (c = 0; c < PROCESSES; c++) { 
    pid[c] = fork(); 
    switch (pid[c]) { 
     case -1: 
      perror("Faild fork!\n"); 
      break; 
     case 0: 
      printf("C = %d\n", c); 
      if (c == 0) { 
       printf("MY ID0 %d\n", getpid()); 
       customers(); 
       break; 
      } 
      if (c == 1) { 
       printf("MY ID1 %d\n", getpid()); 
       cashier(); 
       break; 
      } 
      if (c == 2) { 
       printf("MY ID2 %d\n", getpid()); 
       sales(); 
       break; 
      } 
      if (c == 3) { 
       printf("MY ID3 %d\n", getpid()); 
       warehouse(); 
       break; 
      } 
      break; 

     default: 
      if (c == (PROCESSES - 1)) { 

       for (j = 0; j < PROCESSES; j++) { 
        w = wait(&state); 
        if (w == -1) { 
         perror("Erro na espera!\n"); 
        } 
        printf("Terminar processo %d\n", w); 
       } 
       sleep(2); 
       printf("Fim da simulação.\n\n"); 
       free_shm_sem(); 
      } 

    } 
} 

我期待發生:

C = 0 
MY ID0 3904 
C = 1 
MY ID1 3905 
C = 2 
MY ID2 3906 
C = 3 
MY ID3 3907 

發生了什麼:

C = 0 
MY ID0 3904 
C = 1 
MY ID1 3905 
C = 2 
MY ID2 3906 
C = 3 
MY ID3 3907 
C = 3 
MY ID3 3911 

如果我更改爲:

  if (c == 0) { 
       printf("MY ID0 %d\n", getpid()); 
       customers(); 
       break; 
      } 
      if (c == 1) { 
       printf("MY ID1 %d\n", getpid()); 
       sales(); 
       break; 
      } 
      if (c == 2) { 
       printf("MY ID2 %d\n", getpid()); 
       cashier(); 
       break; 
      } 
      if (c == 3) { 
       printf("MY ID3 %d\n", getpid()); 
       warehouse(); 
       break; 
      } 

釷e的輸出變成:

C = 0 
C = 2 
C = 1 
MY ID0 3960 
MY ID2 3962 
C = 3 
MY ID1 3961 
MY ID3 3963 
C = 2 
MY ID2 3967 
C = 3 
MY ID3 3968 

爲什麼c改變它的值,有時兩次通過相同的地方?

這不是fork()n孩子做不同過程的正確方法嗎?

P.S.對不起,我的英語不好。我希望你能理解我說的話。

回答

1

首先,fork啓動中並行處理,也不能保證它會按順序運行

+0

我不希望它順序運行。但我不想重複的過程,如果你明白... –

6

您是否正在考慮一個事實,即所有派生進程不斷迭代的for循環和叉更多的進程?

考慮第一次迭代:

for (c = 0; c < PROCESSES; c++) { // c is 0 

我們做一個叉:

pid[c] = fork(); 

現在,子進程,pid[0]是0,所以,

switch (pid[c]) { 

進入:

case 0: 
     if (c == 0) { 
      printf("MY ID0 %d\n", getpid()); 
      customers(); 
      break; 
     } 

並做一些打印。然後它離開開關。而c是0,所以它增加c爲1,並執行:

pid[c] = fork(); 

派生一個孫子。

爲了防止這種情況,你可以exit而不是break

 if (c == 0) { 
      printf("MY ID0 %d\n", getpid()); 
      customers(); 
      exit(0); 
     } 
+0

你說有些chield進程分叉他們自己的chields? –

+0

這使我困惑,因爲有條件。 –

+0

你說過,每個chield都會分出一些其他進程嗎?但是,它的內部結果是什麼?我怎麼能分出4個進程並等待它們? –

1

對於應該做特殊處理工藝(即四個第一)做一個單獨的步驟呼籲fork在父過程中的每個人。然後做一個循環來創建你可能需要的所有通用進程。

相關問題