c - sigprocmask() 中的 Set 和 Oldset

标签 c posix signals sigprocmask

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

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}

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

关于c - sigprocmask() 中的 Set 和 Oldset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25261/

相关文章:

在 C 中将单个等号连接到字符串

c - 取模 N 的随机数的均匀性

Linux串口1.5停止位

c - 实现 perror() - 问题

bash - 通过传递参数来捕获函数?

c++ - 从信号处理程序中唤醒线程

c - 无法解码一段代码及其用途

C : multiple lines of input based on previous inputs

linux - 在 shm_open 和 mmap 之间使用 fstat

linux - 读/写阻塞的系统调用是否会将进程置于 TASK_UNINTERRUPTIBLE 或 TASK_INTERRUPTIBLE 状态?