1. ホーム
  2. c

[解決済み] sigprocmask() の Set と Oldset について

2022-02-24 06:28:27

質問

の使い方がよくわかりません。 sigprocmask() . 特に、どのように setoldset とその構文の働きと使い方を説明します。

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

SIGUSR1 を数秒間ブロックし、その後ブロックを解除して処理する例を挙げて説明してください。

どのように解決するのですか?

でマスクを提供することです。 set これは事実上、シグナルのリストである。 そのため how のマスクをどうするかは、引数で指定します。 set .

を使用することができます。 SIG_BLOCK のシグナルをブロックするために set リスト、または SIG_UNBLOCK を使ってブロックを解除することができます。 どちらもリストに設定されていないシグナルは変更されません。 SIG_SETMASK はリスト内のシグナルをブロックし、リスト内に設定されていないシグナルはブロックを解除します。

例えば、古いブロッキングリストが {SIGSEGV, SIGSUSP} を呼び出すと sigprocmask をこれらの引数で指定します。

sigset_t x;
sigemptyset (&x);
sigaddset(&x, SIGUSR1);
sigprocmask(SIG_BLOCK, &x, NULL)

新しいブロックリストは、次のようになります。 {SIGSEGV, SIGSUSP, SIGUSR1} .

を呼び出すと sigprocmask をこれらの引数で今すぐ実行します。

sigprocmask(SIG_UNBLOCK, &x, NULL)

新しいブロックリストが {SIGSEGV, SIGSUSP} .

を呼び出すと sigprocmask をこれらの引数で今すぐ実行します。

sigprocmask(SIG_SETMASK, &x, NULL)

これで、新しいブロックリストには {SIGUSR1} .

oldset 引数は、前のブロックリストが何であったかを教えてくれます。 もし、この宣言があれば

sigset_t y;

で、前の例のコードをこのように呼び出します。

    sigprocmask(SIG_BLOCK, &x, &y)

今、私たちは

y == {SIGSEGV, SIGSUSP}

もし今、私たちが

    sigprocmask(SIG_UNBLOCK, &x, &y)

を取得します。

y == {SIGSEGV, SIGSUSP, SIGUSR1}

とすると

    sigprocmask(SIG_SET, &x, &y)

を取得します。

y == {SIGSEGV, SIGSUSP}

なぜなら、これはブロック化セットの前の値だからです。