【自習メモ】sigaction関数でエラーハンドリング

shuzo-kino.hateblo.jp
の自習メモの続き。
大元で使われていたsigal関数はすでに古いものらしく、sigaction関数を使えというお達しが。

で、そのsigaction関数の定義は以下の通り。
ただし、三番めの引数は非推奨らしく理由がない限りはNULL。

int sigaction(int signum, const struct sigaction *act,
              struct sigaction *oldact);

実際につかうとこんな感じ。

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

static void exit_process()
{
    fprintf(stderr, "Exit normally.\n");
    exit(0);
}


int main(void) {
    int rc = 0;
    struct sigaction act;

    /* シグナル設定 */
    memset(&act, 0, sizeof(act));
    act.sa_handler = exit_process; /* 関数ポインタを指定する */
    act.sa_flags = SA_RESETHAND;   /* ハンドラの設定は一回だけ有効 */

    /* SIGINTにシグナルハンドラを設定する */
    rc = sigaction(SIGINT, &act, NULL);

    // 検証用に10秒だけまつ
    sleep(10);

    return 0;
}

実行結果

$ gcc sigtest2.c 
$ ./a.out 
^CExit normally.

ここで、SIGINTは

SIGINT Termキーボードからの割り込み (Interrupt)

signal関数と比較すると、シグナルを掴むモンが構造体になって色々取り回せるようになったようです。