日々精進

aikoと旅行とプログラミング

プロセスにシグナルを送る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による終了。