fork()は最初はちょっと混乱しているように見えますが、実際はかなりシンプルです。それは、現在のプロセスを別のメモリ上の新しいプロセスにコピーすることです(すべてのもの、そのデータ、コード、現在の命令などをコピーします)。
私たちはpid = 5079のプロセスから始めました。フォークコールを取得すると、pid = 5080の子プロセスが作成され、親プロセスと同じコードが作成されました。我々は次のコードを続行する前に、次のように
// Parent Process // // Child Process //
#include<stdio.h> #include<stdio.h>
#include<unistd.h> #include<unistd.h>
#include<stdlib.h> #include<stdlib.h>
int main() int main()
{ {
printf("\... printf("\...
pid_t pid1=fork(); pid_t pid1=fork();
printf("\nPI... //Next line// printf("\nPI... //Next line//
pid_t pid2=fork(); pid_t pid2=fork();
printf("\nPID:=... printf("\nPID:=...
pid_t pid3=fork(); pid_t pid3=fork();
printf("\nPID:=... printf("\nPID:=...
return 0; return 0;
} }
は、フォークの呼び出しの戻り値は次のとおりです。フォーク()と呼ばれるプロセス内で、戻り値は子プロセスのPID(親でPID1変数でありますプロセス= 5080)、子プロセス内では出力は0(子プロセスではpid1変数= 0)です。
したがって、getpid()値とpid1値が異なる親プロセスと子プロセスによってprintステートメントが実行されると、親プロセスはgetpid()= 5079、pid1 = childのpid = 5080出力の3行目でこれを見ることができます)。子はgetpid()= 5080とpid1 = 0で、独自のprintステートメントを作成しますが、出力の8行目にこれを見ることができますが、なぜ8行目!
オペレーティングシステムはプロセスをスケジューリングします。つまり、CPUが処理するプロセスとその期間を決定します。 OSは親プロセス(pid = 5079)をもう少し長く実行し、CPUがその命令を実行するのを待っている子プロセス(pid = 5080)を残すことにしました。
したがって、プロセス5079は次のフォークを実行し、pid = 5081の新しい子プロセスを作成しました。次に、3行目に期待したものを印刷し、最後のフォーク作成プロセス5082に進み、 (プロセス5079は終了し、5080,5081,5082は待機し、OSによって採用され、親を持つ必要がありますが、これは出力には重要ではありません)。
これで、5079は終了しました.3つのプロセスがメモリ内でCPUで処理を待機しています。
// process 5082 // // process 5081 // // process 5080 //
printf("\nP... printf("\nP... printf("\nP...
return 0; pid_t pid3=fork(); pid_t pid2=fork();
printf("\nP... printf("\nP...
return 0; pid_t pid3=fork();
printf("\nP...
return 0;
がなぜこれです:オペレーティングシステムを実行しているプロセスを決定する必要があり、プロセス5082で終了するために最も近いプロセスを、選択しているようだ、の各プロセスの残りの手順を見てみましょう残りのコード?他のプロセスでforkによって作成されたプロセスは、以前のようにforkステートメントの後に実行を開始します。したがって、プロセス5082は、行5を印刷し、終了する(5079の子であるため、その値pid3 = 0)。 5082の終了後、5081がCPUを取り、6行目を印刷し、6行目に示すようにプロセス5085を作成しました(なぜなら、おそらく5083がOSのコード実行中に何らかのプロセスを作成したのでしょうか?
行6を印刷した後、プロセス5081が終了しました。今私たちは5080と5085をメモリに持っています。 5080が実行されるように選択され、5086と5087が作成されて終了するようになりました。その後、5085が実行され、5087が続き、最後にprintステートメントのみが終了し、5086が残って印刷され、最後のフォークが5088を作成し、印刷後に5088として終了しました。
オペレーティング・システムは、このに興味があるならば、私はこの本をお勧めします、システムコールを越えて行くための魅力的なフィールド、その楽しいです、それは私が大学で研究するものである: https://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720
出典
2017-03-07 21:49:13
bbb
あなたは何を知っていますかフォークは?使い方 ?戻り値? あなたは本当に考えずに使ったようです。新しいプロセスが生成されると、最初に誰が実行されるかは保証されません。だから、本当にどんな出力も期待できます。次はあなた次第です:fork()sys呼び出しの戻り値が何であるかを見てください。 –