MinGWでkill()ライクな関数を作る

MinGWのsignal関連ライブラリにはkill()が含まれない。
簡易的にprocessをkillする関数を作ってみる。

Windows APIを使う

SIGNALに何が指定されても強制的にprocessをkillするだけなら以下の実装で可能。

int killpid(int pid, int sig)
{
    HANDLE hProcess;
    int res = 0;


    /* Whatever comes, we always kill the process */
    switch (sig) {
    case SIGINT:    /* Interactive attention */
    case SIGILL:    /* Illegal instruction */
    case SIGFPE:    /* Floating point error */
    case SIGSEGV:   /* Segmentation violation */
    case SIGTERM:   /* Termination request */
    case SIGBREAK:  /* Control-break */
    case SIGABRT:   /* Abnormal termination (abort) */
    	hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
        if (hProcess == NULL) {
            return -1;
    	}
        if (!TerminateProcess(hProcess, (unsigned int)-1)) {
	    	res = -1;
    	}
        break;
    default:
        return -1;
        break;
    }

    CloseHandle(hProcess);
    return res;
}

コンパイルしてみる

コンパイルする

MinGW

gcc killpid.c -o killpid

Visual C++

cl /W4 killpid.c uuid.lib

実行してみる

tasklistコマンド(Unixのpsに相当)で終了したいプログラムの
PID(Process ID)を探す。
PID = 3192の場合、以下のように実行すれば終了できる。

killpid 3192