- ベストアンサー
fork()2
質問を途中で投稿してしまいました^^; 前質問はNo.945866 forkをしたときは子プロセスが生成されるのはわかるのですが、生成されたあとは、子プロセスからまず開始されるのでしょうか? if(fork() == 0){.....} else { .....} と if(fork() != 0){.....} else { .....} の両方の形で記述してもどちらも子プロセス側から走っていました。環境に依存するというわけではないのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。補足ありがとうございます。 私はfork()のシステムコール内部のことまで詳細に知っているわけではないのでなんとも言えないのですが、ひとつ言えることは、『fork()は重い処理である』ということです。 子プロセスを生成し、親プロセスと同じメモリページを確保してその内容をコピーする(Linuxカーネルのfork()の場合は厳密に言うとコピーはあと回しなのですが)ため、かなり時間がかかります。(といっても人間から見たら一瞬ですが) いずれにしてもfork()したときに行われることはいつも同じですから、同じプログラムなら次のコード実行までに消費するCPU時間も基本的に同じで、もちろん後続の処理の実行時間も同じ(比較演算子==と!=は通常、実行速度は同じはずです)ですから、いつも同じ結果になる、ということでしょう。
その他の回答 (2)
- terra5
- ベストアンサー率34% (574/1662)
おそらくfork()が完了しシステムコールから戻る段階でタスクスケジューラーが動作して制御を渡すプロセス(スレッド)を決定するだろうと思いますので、 スケジューラー次第だと思います。 同じLinuxでもスケジューラーのアルゴリズムが変わっているとか、動作環境が異なるとかで違ってきても不思議はないと思いますが。 ただ、おそらくfork()だと優先順位等は親と同じで、 CPUタイムが0のような気がするので、 子の方がより優先されるような気がします。
- shige_70
- ベストアンサー率17% (168/946)
違います。両方同時に動きます。 fork()した時点で、プロセスは分裂し、ふたつの別個のプロセスとして独立して動きます。 子プロセス側から走った、というのは、具体的にはどうやって確認したのでしょうか?
お礼
いえ、同時に動くのは大丈夫なのですが、見掛け上ではなく、どちらが先にforkした後はどちらが先に開始されるかということです。 たとえば、 if(fork()==0){ for(i=0;i<5;i++){ printf("Child\n"); sleep(1); } } else { for(i=0;i<5;i++){ printf("Parent\n"); sleep(1); } } と記述しても、 if(fork()!=0){ for(i=0;i<5;i++){ printf("Parent\n"); sleep(1); } } else { for(i=0;i<5;i++){ printf("Child\n"); sleep(1); } } としてもどちらも最初にChildと表示されます。つまり、どちらの記述をしても、 $ ./a.out Child Parent Chile Parent ... と出力されてしまうということです。 OSはlinuxでgccでコンパイルしてます。
補足
お礼欄にかいた部分的なプログラムの訂正です。 親プロセス部分に wait(&status); を書き忘れてました。 if(親プロセスの場合){ for(...){ ... } wait(&status); } ですね。ごめんなさい。