Cでフォーク(fork)を使う


『食戟のソーマ』

おいしそうな料理の出てくるアニメですねえ。おなかがすいてすいてしかたありません。このままだと、空腹で眠れなくなってしまいます。冷蔵庫に何か入っていれば食べるのですが、今日は何もないです。仕方ないので、金魚のように、口をパクパクしようかと思います。パクパクしてるうちに、何か食べた気になることが、まれにあります。パクパクして水をがぶがぶ飲んでまたパクパクします。フォークとナイフを持って雰囲気を作って、口をパクパクさせると効果的です。

では、Cでフォーク(fork)使います。

fork()をコールすると、子プロセスが生成されます。プログラムはfork直後に現行プロセスと子プロセスに分かれて動きます。

takk@deb9:~$ cat -n fork.c
     1	#include <stdio.h>
     2	#include <sys/types.h>
     3	#include <unistd.h>
     4	
     5	int main()
     6	{
     7		int i;
     8		pid_t pid1,pid2,my_pid;
     9	
    10		pid1 = getpid();
    11		pid2 = fork();
    12	
    13		if(pid2 == -1)
    14			return -1;
    15		else if(pid2 == 0)
    16			while(1){
    17				my_pid = getpid();
    18				printf("CHILD  my_pid=%d\n",my_pid);
    19				printf("                    pid1=%d\n",pid1);
    20				printf("                    pid2=%d\n",pid2);
    21				sleep(1);
    22			}
    23		else
    24			while(1){
    25				my_pid = getpid();
    26				printf("PARENT my_pid=%d\n",my_pid);
    27				printf("                    pid1=%d\n",pid1);
    28				printf("                    pid2=%d\n",pid2);
    29				sleep(1);
    30			}
    31	
    32		return 0;
    33	}
    34	
takk@deb9:~$ 

11行目のforkが成功するとプログラムが2つに分かれたような動きを見せることから、フォークと名前が付いたのでしょうか? 生成された子プロセスでは0が戻り(15行目のpid==0の判定)、現行プロセスである親プロセスでは子プロセスのIDが戻ります。

takk@deb9:~$ gcc fork.c
takk@deb9:~$ ./a.out
PARENT my_pid=4637
                    pid1=4637
                    pid2=4638
CHILD  my_pid=4638
                    pid1=4637
                    pid2=0
PARENT my_pid=4637
                    pid1=4637
                    pid2=4638
CHILD  my_pid=4638
                    pid1=4637
                    pid2=0
PARENT my_pid=4637
                    pid1=4637
                    pid2=4638
CHILD  my_pid=4638
                    pid1=4637
                    pid2=0
^C
takk@deb9:~$

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA