C言語システムコール-kill

killシステムコール

概要

killは指定プロセスに対して任意のシグナルを送信します。

プロセスグループを対象とすることで、グループ内の複数プロセスに対してシグナルを送信することが可能です。


システムのシグナル一覧を表示する場合には「man signal」コマンドを実行します。

killで使用頻度の高いシグナルとして以下のものがあります。

SIGINT 割り込み
SIGKILL 強制終了
SIGTERM 終了
SIGHUP ハングアップ
SIGQUIT 中止

サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>

/*!
 * @brief     プロセスを終了させる
 * @param[in] pid  プロセスID
 * @return    0:success/-1:failure
 */
static int
terminate_process(pid_t pid)
{
    int rc = 0;

    rc = kill(pid, SIGTERM);
    if(rc < 0){
        printf("Error: kill() %s: (pid=%d)\n", strerror(errno), pid);
        return(-1);
    }

    return(0);
}

/*!
 * @brief      文字列をPIDに変換する
 * @param[in]  str  文字列
 * @return     PID  整数値
 * @return     -1   error
 */
static pid_t
str_to_pid(char *str)
{
    int i = 0;
    int pid = 0;

    /* 数字であることを確認する */
    for(i = 0; str[i]; i++){
        if((str[i] < '0') || (str[i] > '9')){
            fprintf(stderr, "Error: Invalid number=%s\n", str);
            return(-1);
        }
    }

    pid = atoi(str);

    /* PIDの有効値を確認する */
    if((pid > 99999) || (pid < 0)){
        fprintf(stderr, "Error: Invalid pid=%d\n", pid);
        return(-1);
    }

    return((pid_t)pid);
}

int
main(int argc, char *argv[])
{
    int rc = 0;
    pid_t pid = 0;

    if(argc != 2){
        fprintf(stderr, "Usage: %s <pid>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    pid = str_to_pid(argv[1]);
    if(pid < 0) exit(EXIT_FAILURE);

    rc = terminate_process(pid);
    if(rc != 0) exit(EXIT_FAILURE);

    exit(EXIT_SUCCESS);
}

関連ページ