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

sigsuspendシステムコール

概要

sigsuspendは一時的にシグナルマスクを変更して、シグナルの到着を待ちます。

設定されたシグナルを受信するまで、そのプロセスを停止します。


sigsuspendシグナルを受信してリターンするので、戻り値は常に「-1」を返します。

また、通常はEINTRエラーが発生します。


サンプルプログラム

SIGINT([Ctrl] + [c])を待ち合わせます。

SIGINTを受信すると、10秒間待ち合わせて通常処理に戻ります。


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

/*!
 * @brief     カウントダウンして時間待ち合わせ
 */
static void
count_down()
{
    int cnt = 0;

    fprintf(stdout, "\nsignal recieved.\n");
    fflush(stdout);

    for(cnt = 10; cnt > 0; cnt--){
        fprintf(stdout, "wait: %02d(sec)\r", cnt);
        fflush(stdout);
        sleep(1);
    }

    fprintf(stdout, "\n");
    fflush(stdout);
}

/*!
 * @brief     シグナルの到着を待つ
 * @return    0:success/-1:failure
 */
static int
signal_suspend(void)
{
    int rc = 0;
    sigset_t set = {0};
    struct sigaction act;

    memset(&act, 0, sizeof(act));
    act.sa_handler = count_down;

    printf("Waiting SIGINT.\n");

    rc = sigaction(SIGINT, &act, NULL);
    if(rc < 0){
        printf("Error: sigaction() %s\n", strerror(errno));
        return(-1);
    }

    /* シグナル集合を空に初期化する。*/
    sigemptyset(&set);

    /* シグナルの到着を待ち合わせる */
    sigsuspend(&set);

    printf("Arrived SIGINT.\n");

    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 = signal_suspend();
    if(rc != 0) exit(EXIT_FAILURE);

    exit(EXIT_SUCCESS);
}

関連ページ