2017-06-27 5 views
1

私は単純なパイプいくつかの情報を書き込むために子プロセスを作成するプログラムがあり、親プロセスはこの情報を表示します。プロセスの数を確認する

int main() { 
    int pfd[2], i, n; 
    pipe(pfd); 
    for(i=0; i<3; i++) { 
    if(fork() == 0) { 
     write(pfd[1], &i, sizeof(int)); 
     close(pfd[0]); close(pfd[1]); 
     exit(0); 
    } 
    else { 

    } 
    } 
    for(i=0; i<3; i++) { 
     wait(0); 
     read(pfd[0], &n, sizeof(int)); 
     printf("%d\n", n); 
    } 
    close(pfd[0]); close(pfd[1]); 
    return 0; 
} 

この状況では、親プロセスには次の結果が表示されます。0 ,1 and 2

exit(0)が含まれている行を削除すると、プログラムで作成されたプロセスの数はどのようにわかりますか?

ありがとうございます。

+1

作成されるプロセスの数は、 'fork()'の呼び出し回数に等しいです。 'exit(0)'呼び出しを削除すると、子プロセスはループを継続しようとします( 'fork()')し、 'wait(0)'します。彼らは 'wait()'の中から 'ECHILD'を得るでしょう。これは本当にあなたが意図するものなのでしょうか、それとも別のことを意味していますか? –

+0

あなたの質問は非常に不明です。 – Stargateur

答えて

1

以下は、作成された子の数を追跡する実例です。 fork()は、親/子の間で変数を共有できない別のアドレス空間を作成することに注意してください。しかし、プログラムカウンターは同じままなので、fork()への呼び出しの直後に親と子が実行されます。

ループ内でfork()を実行すると、身体を実行する条件(再びfork()を含む)に合格すると、子供は身体の最後に到達します。

#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdio.h> 



int main() { 
    int pfd[2], i, n; 
    pid_t children_pids[3]; 
    int children_created = 0; 
    memset(children_pids, 0, sizeof(children_pids)); 

    pipe(pfd); 
    for(i=0; i<3; i++) { 
    pid_t p = fork(); 
    if(p == 0) { 
     write(pfd[1], &i, sizeof(int)); 
     close(pfd[0]); close(pfd[1]); 
     exit(0); 
//  break; 
    } 
    else { 
     children_pids[children_created++] = p; 
    } 
    } 
    for(i=0; i<3; i++) { 
     pid_t p = waitpid(children_pids[i], NULL, 0); 
     if (p == -1) { 
      /* error, but expected w/o exit() above */ 
      continue; 
     } 
     read(pfd[0], &n, sizeof(int)); 
     printf("%d\n", n); 
    } 
    close(pfd[0]); close(pfd[1]); 

    printf("Total children: %d\n", children_created); 
    return 0; 
} 
関連する問題