fork文を攻略しよう!(システムプログラミング)

 

1.#include<stdio.h> //標準入出力に関するヘッダファイル

2.#include<unistd.h> //UNIX標準に関するヘッダファイル

3.int main(){

4.fork();

5.fork();

6.printf("A¥n");

7.return 0;

8.}

 

今回はこのfork文が2回出てくるプログラムについての解説をしていきます。

 

まず、前提としてfork関数について知ってもらわないといけないので説明しておきますね。

 

【fork関数は、呼び出し元プロセスを複製して、子プロセス(新しいプロセス)を生成します。

 

fork関数を呼び出した(実行した)プロセスを親プロセス、新しく生成したプロセスを子プロセスと呼んでいます。

 

子プロセスにはユニークなプロセスIDが付与されます。】

http://www.c-lang.net/fork/index.htmlより引用

 

はい。こんな感じです。

 

では、このプログラムのプロセスについて解説していきます。

 

まず、4行目のforkで親プロセスは子プロセスを作ります。

 

ここで作られたプロセスを子1としましょう。

 

そして、5行目のforkでまたしても親プロセスは子プロセスを作ります。

 

ここで作られたプロセスは子2としましょう。

 

そして、親プロセスは6行目のプリント文でAを出力して実行を終了します。

 

次に子1プロセスを見ていきましょう。

 

子1は親プロセスによって4~8行目までがコピーされたプロセスです。

 

なので5行目で子1プロセスは親プロセスとなり子プロセスを作ります。

 

ここで作られたプロセスは子が作った子なので孫プロセスと呼ぶことにしましょう。

 

そして、子1プロセスは6行目のプリント文でAを出力して実行を終了します。

 

ちなみにここでの実行結果は

$ A

bash $ A

となっているはず。

 

では、子2プロセスを見ていきましょう。

 

子2プロセスは親プロセスによって5~8行目までがコピーされたプロセスです。

 

なので、子2プロセスは6行目でAを出力するだけの動作で終了します。

 

孫プロセスも同様で子1プロセスによって5~8行目までがコピーされたプロセスですから当然Aを出力するだけで終了します。

 

これで全プロセスの実行が終了しました。

 

実行結果は

$ A

bash $ A

$A

$A

となっているはず。

 

上から順に

親プロセスのA

子1プロセスのA

子2プロセスor孫プロセスのA

子2プロセスor孫プロセスのA

となっています。

 

 

以上で解説を終えます。

 

どうだったでしょうか?

 

これでforkはバッチリ??

 

👋🏼またね