- ベストアンサー
プロセスに関するプログラムの動きとプロセス生成数の判定方法
- UNIX系OSでのプロセスの動きを確認するプログラムの特徴として、プロセスの番号が順番どおりに並ばないことがあることについて説明します。
- また、コマンドライン引数で与えられた整数の数によってプロセスを生成するプログラムの実装方法と、プロセスの最大生成数を判定する点について詳しく説明します。
- プロセスの親子関係やプロセスIDなど、プロセスに関する基礎知識も合わせて紹介します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>結果として私が提示したプログラムではプロセスの最大数を判定するのは不可能なのでしょうか? まず、csh系ならlimit、sh系ならulimit -aの結果を確認してください。そこにmaxprocとかあると思いますが、それが現ユーザの実行可能プロセス数となります。OSによってはもっと細かい制御も可能かも知れません。詳しくはman 2 getrlimit, man 2 setrlimitなど。 その上で、ある程度までlimitを下げれば、まあ可能かも知れませんが、いずれにしてもprintfしただけですぐ終了しては意味が薄いですから、sleep()でもはさめば効果はあるでしょう。 >あと実行結果で親IDが1にならないものはどういう状況が起こっているのかということも疑問としてあがってきました。 親が責任放棄して終了した場合、initのpid=1に設定されるのはご存知のとおりです。逆に親がまだ存命ならそのpidが子のppidです。元のプログラムだと親がbreakでループからぬけてすぐ終了してますので、ほとんどppidが1になっていたでしょうが、修正版は子の終了まで親がwait()してます。 もちろん目的があって親が先に終了してしまうことも良くあります。daemonなどがそうですが、この場合は動作状況の確認の意味で親は待ってます。 詳しくは、man 2 fork, man 2 waitなど。
その他の回答 (1)
- trapezium
- ベストアンサー率62% (276/442)
質問1は簡単です。他のdaemonなどによってforkされたプロセスもあるし、すでに実行中のpidは飛ばされるだろうから。 それよりこのプログラムの動作として、親から子へ、子から孫へ、またその孫へとなっていて、親は子の終了を待たずに終了してます。ですからforkした方はforkしたそばから終了してる。 もしプロセステーブルをいっぱいにしたいのなら、forkしたあと子は動作を継続させ、親はwait()しないとならないでしょう。イメージとしては、 ----- for(i = 0; i < np; i++) if ((child_id = fork()) == -1) { perror("fork"); break; } else if (0 == child_id) { printf("child: %d: process ID=%ld parent ID =%ld\n", i, (long)getpid(), (long)getppid()); sleep(10); exit(0); } else { /* parent */ printf("%d: process ID=%ld child ID=%ld\n", i , (long)getpid(), (long)child_id); } while (i-- > 0) { int status; pid_t pid = wait(&status); printf("%d\n", pid); } ---- これで十分大きい値を与えればforkも失敗するように出来るでしょう。そういえば >if(argc == 2) { は if(argc < 2) { ね。 あとはwait()をシグナルハンドらで処理するとか、逆にwaitを親のループ内で行えば、ひとつずつ子をforkして終了を待つ動作になります。
お礼
質問の回答と問題点の指摘をしていただいてありがとうございます。 結果として私が提示したプログラムではプロセスの最大数を判定するのは不可能なのでしょうか? あと実行結果で親IDが1にならないものはどういう状況が起こっているのかということも疑問としてあがってきました。 不躾ではありますが、もしよろしければ参考意見でもいいので宜しくお願いします。
お礼
なるほど、大変参考になりました。 教えていただいたコマンドを試してみた後、sleepを挟んでどのような結果になるのかを見てみたいと思います。 最後まで丁寧に教えていただいて助かりました。 本当にありがとうございました。