プロセスにシグナルを送るkill関数メモ
プロセスにシグナルを送るkill関数についてのメモ
書式
#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);
概要
任意のプロセスグループまたはプロセスにシグナルを送ることができる。第一引数に指定されたプロセスpidに第二引数のsigが送られる。pidに0を指定した場合は、呼び出し元のプロセスグループすべてに送られる。pidに0を指定した場合シグナルは送られないが、エラーチェックは行われる。
返り値
成功した場合は0、失敗した場合には-1が返されerrnoにエラー内容が格納される。
エラー内容は以下のとおり
名前 | 意味 |
---|---|
SINVAL | 無効なシグナル |
EPERM | シグナルを送る許可を持っていない |
ESRCH | 指定したプロセスまたはプロセスグループが存在しなかった |
実装例
fork関数を使って子プロセスを生成し、子プロセスをkill関数を使って終了させる例
#include <sys/types.h> #include <signal.h> #include <unistd.h> #include <sys/time.h> #include <stdio.h> #include <stdlib.h> int main(){ pid_t pid, result; int status, code; pid = fork(); // fork失敗 if(pid == -1){ fprintf(stderr, "Error\n\n"); } // 子プロセスの処理 if(pid == 0){ while(1){ printf("Child Process\n"); sleep(1); } }else{ sleep(3); kill(pid, SIGKILL); result = wait(&status); if(result < 0){ fprintf(stderr, "Wait Error.\n\n"); exit(-1); } // シグナルによる終了 if (WIFSIGNALED(status)) { printf("シグナル番号:%dによる終了。\n",WTERMSIG(status)); } } return 0; }
実行結果は以下のとおり
$ a.out
Child Process
Child Process
Child Process
Child Process
シグナル番号:9による終了。