sigprocmask()で設定およびOldset
-
09-06-2019 - |
質問
sigprocmask()
の使用方法が完全には理解されていません。特に、 set
と oldset
およびその構文の動作方法と使用方法。
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)
これを取得します:
<*>これはブロッキングセットの以前の値だからです。