sigprocmask() 中的 Set 和 Oldset

发布于 2024-07-04 12:05:59 字数 249 浏览 7 评论 0原文

我还没有完全理解如何使用sigprocmask()。 特别是 setoldset 及其语法如何工作以及如何使用它们。

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

请举例说明,要阻止,请说 SIGUSR1 几秒钟,然后解除阻止并处理它。

I haven't completely understood, how to use sigprocmask(). Particularly, how the set and oldset and its syntax work and how to use them.

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

Please explain with an example, to block, say SIGUSR1 for a few seconds and then unblock and handle it.
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蹲墙角沉默 2024-07-11 12:05:59

这个想法是在 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}

因为这是之前的值阻塞集。

The idea is that you provide a mask in set, effectively a list of signals. The how argument says what you should do with the mask in set.

You can either use SIG_BLOCK to block the signals in the set list, or SIG_UNBLOCK to unblock them. Neither of these changes the signals that aren't set in the list. SIG_SETMASK blocks the signals in the list, and unblocks the ones that aren't set in the list.

For instance, assume that the old blocking list was {SIGSEGV, SIGSUSP} and you call sigprocmask with these arguments:

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

The new blocking list will now be {SIGSEGV, SIGSUSP, SIGUSR1}.

If you call sigprocmask with these arguments now:

sigprocmask(SIG_UNBLOCK, &x, NULL)

The new blocking list will go back to being {SIGSEGV, SIGSUSP}.

If you call sigprocmask with these arguments now:

sigprocmask(SIG_SETMASK, &x, NULL)

The new blocking list will now be set to {SIGUSR1}.

The oldset argument tells you what the previous blocking list was. If we have this declaration:

sigset_t y;

and we call the code in the previous examples like this:

    sigprocmask(SIG_BLOCK, &x, &y)

now we have:

y == {SIGSEGV, SIGSUSP}

If we now do:

    sigprocmask(SIG_UNBLOCK, &x, &y)

we'll get

y == {SIGSEGV, SIGSUSP, SIGUSR1}

and if we do:

    sigprocmask(SIG_SET, &x, &y)

we'll get this:

y == {SIGSEGV, SIGSUSP}

because this is the previous value of the blocking set.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文