最後に 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