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

signalシステムコール

概要

siganlはシグナル受信時の処理を設定します。

signalシステムコールはsigactionシステムコールと同様にシグナルハンドラを設定しますが、シグナル関連設定として構造体を用いず引数に値を直接指定します。

なお、OSによっては、signalはsigactionシステムコールを呼び出すCライブラリ関数として用意されています。


シグナルハンドラとは

シグナルハンドラとは、プロセスがシグナルを受信したときに実行する処理(関数)です。

プロセスがシグナルを受信すると、実行中のプロセス処理を一時中断し、そのシグナルに対応した処理「シグナルハンドラ」を実行します。

シグナルハンドラ処理が終了すると元の処理を再開します。


サンプルプログラム


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

/*!
 * @brief    SIGINT受信時の動作
 */
static void
sigint_action(int sig)
{
    fprintf(stdout, "SIGINT recieve\n");
}

/*!
 * @brief     シグナルハンドラを設定する
 * @return    0:success/-1:failure
 */
static int
set_signal_handler(void)
{
    /* SIGINT(Ctrl+c)の設定 */
    if(signal(SIGINT, sigint_action) == SIG_ERR){
        printf("Error: signal() SIGINT: %s\n", strerror(errno));
        return(-1);
    }

    return(0);
}

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

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

    rc = set_signal_handler();
    if(rc != 0) exit(EXIT_FAILURE);

    /* 待ち合わせ */
    sleep(60);

    exit(EXIT_SUCCESS);
}


関連ページ