の使い方がよくわかりませんsigprocmask()
。特に、set
andoldset
とその構文がどのように機能し、どのように使用するかについて説明します。
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
例を挙げて説明してください。ブロックするには、SIGUSR1 を数秒間言ってから、ブロックを解除して処理します。
の使い方がよくわかりませんsigprocmask()
。特に、set
andoldset
とその構文がどのように機能し、どのように使用するかについて説明します。
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}
これはブロッキング セットの以前の値であるためです。