Linuxのfork()関数で1つのプログラムを複数のプロセスで分割処理する

thumnail
2020-09-04

fork()関数とは

Linuxに搭載されているfork()関数を使えば、1つのプログラムを複数のプロセスに分割して処理を行うことができる。具体的に言うとfork()関数を実行すると現在のプロセスの内容が別のメモリ領域にコピーされ、処理が並列に実行される。

fork()関数を使って2つのプロセスで並列処理をする

fork()関数を使って、1つのプログラムで複数のプロセスを生成するということを確かめてみる。fork()関数を呼び出し後、文字列を出力するだけのC言語のプログラムを書いて実行してみた。

$ cat fork.c
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
int main() 
{ 

    fork(); 

    printf("Hello world!\n"); 
    return 0; 
} 

$ cc -o fork fork.c

$ ./fork
Hello world!
Hello world!

初めに実行ファイルを実行した時にプロセスが生成される。そしてそのプロセスの中でfork()関数が処理されて、子プロセスが生成・実行される。結果として2回、Hellow world!が出力されるのだ。

プロセス毎に処理を分割する

今回の記事で伝えたかった複数のプロセスで処理を分割する方法について紹介する。fork()関数は子プロセスの場合は0、親プロセスの場合は子プロセスのPIDを戻り値として返す。これによって親プロセスと子プロセスで処理を切り替えることができる。ちなみに子プロセスが生成されたとき、子プロセスの処理はfork()関数から復帰する。では実際に親プロセスと子プロセスで出力結果を変えるC言語のプログラムを用意した。

$ cat fork2.c
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
void forkexample() 
{ 
    if (fork() == 0) 
        printf("Hello from Child!\n"); 

    else
        printf("Hello from Parent!\n"); 
} 
int main() 
{ 
    forkexample(); 
    return 0; 
}

$ cc -o fork2 fork2.c

$ ./fork2
Hello from Parent!
Hello from Child!

それぞれプロセスによって出力が切り替わっていることが確認できる。ちなみに親プロセスの処理が先に呼ばれるのは、子プロセスを生成した後、親プロセスのfork()から処理が復帰するからだ。このプログラムを通して、プロセスを分割して処理を切り分けるという概念が少しわかった気がする。

参考サイト

https://www.geeksforgeeks.org/fork-system-call/

KATUBLO

Copyright since 2018 KATUO All Rights Reserved.