75.3. fork() を 4 回コールする

 最後に fork() をコールする際の親プロセスの管理について軽く説明しておきます。

 親プロセスの 0 がいっぱいありますが、親プロセスは何も処理せずスルーするとコードの可読性がグーンと上がります。

 では試して見ましょう。

main.c. 

  1 #include <unistd.h>
  2 #include <assert.h>
  3 #include <stdio.h>
  4
  5 int main()
  6 {
  7   pid_t pid1,pid2,pid3,pid4;
  8   pid1 = fork();
  9   pid2 = fork();
 10   pid3 = fork();
 11   pid4 = fork();
 12   if(pid4 != 0) {
 13     printf("pid4: %d\n",pid4);
 14   } else {
 15     assert(pid4 == 0);
 16   }
 17   return 0;
 18 }

ビルドと実行結果. 

$ gcc main.c
$ ./a.out
pid4: 10487
pid4: 10489
pid4: 10490
pid4: 10491
pid4: 10493
pid4: 10494
pid4: 10495
pid4: 10496

 4 回目の fork() 関数のコールは子プロセスの ID 8 個を確認できましたね

 子プロセスが増えていってますね…

 それで子プロセスの ID は 0 なのでこれはフィルターします。

 12   if(pid4 != 0) {
 13     printf("pid4: %d\n",pid4);
 14   } else {
 15     assert(pid4 == 0);
 16   }

 つまり 0 以外の子プロセスと親プロセスの処理は別々に分けるってことですね。

 assert() は pid4 が 0 の場合でないなら、プログラムを止めたいからつけてるだけです。

 まあこの場合は親プロセスだけで処理をしていますが、その逆でも良いわけですが、そうするとプロセス ID が分かんなくなっちゃいますよね?

Copyright 2018-2019, by Masaki Komatsu