このブログでforkの基本的な使用方法について幾度か書いたことがあります。
今回は、親、子各々のプロセスから自分の環境におけるプロセスIDを表示させるプログラムを作りました。
fork()というシステムコールはまったく同じプロセスを複製するわけですが、その際に親と子でもで戻り値が異なることが最大のミソです。
戻り値をチェックして、if文を使って親と子それぞれの下流の処理を記述してあげればいいのです。
// fork_test.c
#include<sys/types.h> //fork
#include<stdio.h> //printf
#include<stdlib.h> //exit
int main(void)
{
int pid;
if((pid = fork()) < 0){
perror("fork_test");
exit(1);
}
else if((pid == 0)){
//child processには0が戻る
printf("I am the child process.My process ID is %d\n", pid);
return 0;
}
else{
//parent processには子のプロセスIDが戻る
printf("I am the parent process.My process ID is %d\n", pid);
}
return 0;
}
$ gcc -o fork_test fork_test.c
$ ./fork_test
I am the parent process.My process ID is 3412
I am the child process.My process ID is 0
少しく工夫して、親、子のプロセス各々でシステムコールのgetpidを用いて、自らのPIDを取得させるとともに、if文の中で実行されたforkの戻り値を表示させるプログラムを作りました。
子プロセスではさらに、getppid(get parent process id)というシステムコールにより、親のPIDを取得し、表示させています。
// fork_test_2.c
#include<sys/types.h> //fork
#include<stdio.h> //printf
#include<stdlib.h> //exit
#include <sys/types.h> //getpid, getppid
#include <unistd.h> //getpid, getppid
int main(void)
{
int pid;
if((pid = fork()) < 0){
perror("fork_test");
exit(1);
}
else if((pid == 0)){
//getpid()によりProcess IDを取得、表示
printf("I am the child process.My process ID is %d\n", getpid());
//child processには0が戻る
printf("My pid variance is %d in my environment.\n", pid);
//getppidにて、親プロセスのprocess IDを調べる。
printf("My parent process ID is %d\n", getppid());
return 0;
}
else{
//getpid()によりProcess IDを取得、表示
printf("I am the parent process.My process ID is %d\n", getpid());
//parent processにが子プロセスProcess IDが戻る
printf("My pid variance is %d in my environment.\n", pid);
}
return 0;
}