Cライブラリ関数 -sigpending()

sigpendingこの関数はC標準ライブラリ内の関数であり、現在のプロセスの保留中(未決)のシグナルセットを取得するために使用されます。未決シグナルは、ブロックされた後まだ処理されていないシグナルです。この関数は、<signal.h>ヘッダファイル内に定義されています。

構文

int sigpending(sigset_t *set);

引数

  • sigset_t *set:ポインタが指す、sigset_t型の変数。この変数には、現在のプロセスの保留中シグナルセットが格納されます。

戻り値

  • 成功すると0を返します。
  • 失敗時には -1 を返し、設定しますerrnoエラーの種類を示すために。

例

以下は、次を使用するsigpending関数を使用して現在のプロセスの保留中シグナルセットを取得するサンプルプログラムです。このプログラムはSIGINTシグナルをブロックし、その後そのシグナルを送信し、sigpendingそのシグナルが保留中シグナルセット内にあるかどうかを確認します。

例

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void handle_sigint(int sig) {
    printf("Caught signal %d\n", sig);
}

int main() {
    sigset_t new_mask, old_mask, pending;

    // SIGINT のハンドラを設定する
    signal(SIGINT, handle_sigint);

    // シグナルセットを初期化し、SIGINT シグナルをブロックする
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);
    if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
        perror("sigprocmask");
        return 1;
    }

    // SIGINT シグナルを送信する
    raise(SIGINT);

    // 保留中シグナルセットを取得する
    if (sigpending(&pending) == -1) {
        perror("sigpending");
        return 1;
    }

    // SIGINT が保留中シグナルセット内にあるかどうかを確認する
    if (sigismember(&pending, SIGINT)) {
        printf("SIGINT is pending\n");
    } else {
        printf("SIGINT is not pending\n");
    }

    // 元のシグナルマスクを復元する
    if (sigprocmask(SIG_SETMASK, &old_mask, NULL) == -1) {
        perror("sigprocmask");
        return 1;
    }

    return 0;
}

プログラムをコンパイルして実行すると、出力は次のようになります:

SIGINT is pending
Caught signal 2

プログラムはまずSIGINTシグナルをブロックし、その後そのシグナルを送信し、sigpendingチェックし、SIGINT保留中シグナルセット内にあるかどうかを確認します。最後に、プログラムは元のシグナルマスクを復元し、SIGINTシグナルを捕捉して、シグナルハンドラを実行します。

解説

  • sigset_t new_mask, old_mask, pending;:3つのシグナルセットを定義し、シグナルマスクの制御と保留中シグナルセットの保存に使用します。
  • 使用してsigprocmask関数でブロックしSIGINTシグナルをブロックし、元のシグナルマスクを保存します。
  • 使用してraise関数で送信しSIGINTシグナル。
  • 使用してsigpending関数で保留中シグナルセットを取得し、確認しSIGINT保留中シグナルセット内にあるかどうかを確認します。
  • 使用してsigprocmask関数で元のシグナルマスクを復元します。

注意事項

  • sigpendingこの関数は現在のプロセスの保留中シグナルセットを取得します。送信されたがまだ処理されていないすべてのシグナルが含まれます。
  • シグナルハンドラはできるだけ短くする必要があります。シグナルを処理している間は他のシグナルがブロックされるためです。長時間実行されるシグナルハンドラは、プログラムのリアルタイム性に影響を与える可能性があります。

C 标准库 - <signal.h>C標準ライブラリ - <signal.h>

その他の拡張