質問

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)

これを取得します:

<*>

これはブロッキングセットの以前の値だからです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top