2017-11-29 37 views
0
#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 

void fork4() 
{ 
    printf("\n [%d] L0 \n", getpid()); 
    if (fork() != 0) 
    { 
     printf("\n [%d] L1 \n" , getpid()); 
     if (fork() != 0) 
     { 
      printf("\n [%d] L2 \n" , getpid()); 
      fork(); 
     } 
    } 
    printf("\n [%d] Bye \n" , getpid()); 
} 

int main() 
{ 
    fork4(); 
    return 0; 
} 

出力の場合には:は条件付き

[4141] L0 

[4141] L1 

[4142] Bye 

[4141] L2 

[4141] Bye 

[4143] Bye 

[4144] Bye 

私は何が起こっている正確に理解しようとしているが、出力は非常に奇妙です!スコープの場合、親プロセスが最初に入ることができる理由はわかりません!誰かがここで何が起きているのかを説明すれば大丈夫でしょうか?

+1

'fork()'の結果は、親プロセスではゼロ(成功の場合は正、失敗の場合は-1)で、子プロセスではゼロです。これは、親プロセスIDを取得する必要があるためです。子プロセスは、 'getppid()'を呼び出すことによって、常に現在の親プロセスID(自然または養子)を取得できます。 *親プロセスだけが 'if'を入力できます。 – AlexP

答えて

0

出力に注意してください。

ID:4141のプロセスのみが表示され、ifに入ることができます。子プロセスが正常に作成された後、fork()の戻り値は子プロセスIDです。

プロセスID:4141はあなたの親プロセスです。このプロセスは子プロセス4142,4143,4144を作成fork()文を、呼び出していると...これらのプロセス(4142,4143)の

なしあなたif声明に入ることはできません。これらのプロセスでは、fork()ステートメントの実行が成功すると戻り値はゼロになるためです。プロセスとについては

、それらはfork()から作成されます後、実行の次のステートメントは、「バイバイ」の文です。