31

の使い方がよくわかりませんsigprocmask()。特に、setandoldsetとその構文がどのように機能し、どのように使用するかについて説明します。

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

例を挙げて説明してください。ブロックするには、SIGUSR1 を数秒間言ってから、ブロックを解除して処理します。

4

1 に答える 1

77

アイデアはset、効果的に信号のリストである でマスクを提供することです。引数は、のhowマスクで何をすべきかを示しますset

を使用して、リストSIG_BLOCK内のシグナルをブロックするか、ブロックを解除できます。これらのどちらも、リストに設定されていないシグナルを変更しません。 リスト内の信号をブロックし、リストに設定されていない信号のブロックを解除します。setSIG_UNBLOCKSIG_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}

これはブロッキング セットの以前の値であるためです。

于 2008-08-24T18:57:50.587 に答える