![]() |
![]() |
TOP > C言語 > プロセスの生成 |
![]() |
![]() |
プロセスの生成
Cのプログラム中から、新しくプロセスを生成するには、fork()関数を用いる
以下は、簡単な手順である。
1.forkで子プロセスを生成
2.execで、子プロセスを実行
3.親プロセスは、waitpid関数で子プロセスを待ち、残りの処理を実行
fork関数
fork関数を呼び出すと、カーネルはそのプロセスを複製し、2つのプロセスに分裂する。
子プロセスは、forkの戻り値は0なので、処理を親プロセスと子プロセスで、分岐させる。
宣言:void fork(void)
exec関数
exec関数は、自プロセスを新しいプログラムで上書きする関数。
呼び出した時点で、現在のプログラムに上書きする。
ここでは、exec関数は、何種類もあるので詳細は述べません。
waitpid関数
waitpid関数は、指定したプロセスが終了するのを待つ。
宣言:pid_t waitpid(pid_t pid, int *status, int options);
プロセスの生成
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> int main(int argc, char** argv) { pid_t pid; int status; /// 新しいプロセスを作る /// カーネルは、同じプロセスをもう1つ作る pid = fork(); /// プロセス作成に失敗した時は、0未満を返す if ( pid < 0 ) { fprintf (stderr, "fork error\n"); exit(1); } /// 子プロセスのpidは、0 if (pid == 0) { execl("/bin/echo", "echo", "hahaha", NULL); perror("/bin/cat"); exit(-1); } else { /// 子プロセスの終るのを待つ waitpid(pid, &status, 0); printf ("child(PID=%d) finished!\n", pid); if (WIFEXITED(status)){ /// 子プロセスがexit以外で終了した場合は0を返す /// exitで終了した時は、0以外を返す printf("exit, status=%d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)){ /// シグナルで終了していた時は0以外を返し、 /// それ以外は、0を返す printf("signal, sig=%d\n", WTERMSIG(status)); } else { printf("abnormal exit\n"); } exit(0); } return(0); } |
![]() |
![]() |
Copyright 2007 ためになるホームページ All Rights Reserved. |