0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

sigtimedwait() サンプルコード(備忘録)

Posted at

概要

C 言語における sigtimedwait() 関数の使用方法をメモ。

サンプルコード

#define TIME_OUT_MS (3000) // タイムアウト時間.
#define SIGNAL_HOGE (SIGRTMIN+3) // 送受信するシグナル.

// ------------略----------------

    sigset_t sigset;
    siginfo_t siginfo = (siginfo_t){0};
    struct timespec timeout = (struct timespec){0};
    int timeout_ms = TIME_OUT_MS; // タイムアウト時間(ミリ秒).

    sigemptyset(&sigset);
    sigaddset(&sigset, SIGNAL_HOGE);


    // tv_nsec には 1,000,000,000 以上の値が入ってはならない.
    // この例では timeout_ms がミリ秒なので、↓のように処理しておく.
    if(timeout_ms >= 1000){
        timeout.tv_sec = timeout_ms / 1000;
        timeout.tv_nsec = (timeout_ms % 1000) * 1000 * 1000;
    }
    else{
        timeout.tv_sec = 0;
        timeout.tv_nsec = timeout_ms * 1000 * 1000;
    }


    // シグナル待機.
    // シグナル受信 or タイムアウト時間経過まで、処理はここでブロックされる.
    if(sigtimedwait(&(sigset), &siginfo, &timeout) < 0){
        if(errno == EAGAIN){
            printf("sigtimedwait timeouted in %s, line %d, file %s\n", __func__, __LINE__, __FILE__);

            // タイムアウト.
            // タイムアウトの場合の処理を書く.
            
        }
        else if(errno != EINTR){
            fprintf(stderr, "sigtimedwait for SIGNAL_HOGE failed with errno: %d, in func %s, line %d, file %s\n", errno, __func__, __LINE__, __FILE__);
            exit(EXIT_FAILURE);

            // タイムアウトと割込み以外のエラーはここではじく.
            // Ctrl-C の時の動作がわからんかったので EINTR 以外としたが、EINTR を除外しなくてもいいかも? わからん.

        }
    }
    else{
        printf("SIGNAL_HOGE received in %s, line %d\n", __func__, __LINE__);

        // シグナル受信.
        // シグナルを受信した場合の処理を書く.
    }
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?