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

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

请解释一个例子,阻止,说SIGUSR1几秒钟,然后解锁并处理它。

===============>>#1 票数:70 已采纳

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

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

  ask by Sushant translate from so

未解决问题?本站智能推荐:

2回复

信号执行期间的sigprocmask

我目前正在研究在执行关键代码段时使用sigprocmask阻止某些信号(在这种情况下为SIGALRM和SIGCHLD )。 与这些信号关联的两个信号处理程序都将访问和修改中央数据结构,因此至关重要的是,在主要进程正在处理它们时,防止它们访问它们。 目前,我的计划是在代码关键部分的开头简单
2回复

sigprocmask()在UNIX中阻塞信号

我写了一小段代码。 此代码首先阻塞{SIGSEGV},然后将SIGRTMIN添加到同一个集合中。 所以,我的最终信号集是{SIGSEGV,SIGRTMIN}。 因此,如果我使用SIG_UNBLOCK,根据我的理解,第一个SIGRTMIN应该被解除阻塞,然后如果我调用SIG_UNBLOCK,
1回复

sigprocmask不会恢复我的信号处理程序

我的代码C Unix有问题。 我将复制关键部分:所以在第一个sigprocmask之后我发送一个信号,在SIG_UNBLOCK之后,不能使用前一个句柄(gestisciSignalDopoReg)而不是标准句柄管理我的信号,所以它只是终止进程...出了什么问题? 谢谢 请! 我需要
1回复

sigprocmask之后的sigset_t值

从man sigprocmask : “如果oset不为null,则将其设置为信号掩码的先前值。” 我的问题:在不运行或调试程序的情况下, 在执行第10行之后,旧信号掩码的值将存储到y 。 由于在执行此行之前没有阻塞信号,因此y的值是多少? 在执行第14行之
1回复

如何在C中阻止信号?

我正在尝试创建一个阻止信号SIGUSR1的程序,并且它将取消阻止该信号。 在中间,我想看看信号被sigpending阻塞了。 但是它总是说信号没有被阻塞,在应该被阻塞的情况下我可以使用该信号。 这是我的代码。 有人可以帮我吗?
1回复

使用sigprocmask设置掩码仅在调用位置有效

我有一个奇怪的行为,联机帮助页和Google帮不上忙。 在我的代码中,我想在发送SIGUSR2时阻止/取消阻止SIGINT。 为此,我安装了信号处理程序并为函数中的掩码准备了集合: 然后,如果发送SIGUSR2,则调用此函数: 为了测试,我这样称呼它: 现在的问题
1回复

sigprocmask不起作用,导致循环

这部分代码用于在接收到SIGUSR1信号时执行新进程,因为该进程具有子进程,也需要退出,因此请使用kill将SIGUSR1发送到进程组,以避免循环,使用sigprocmask进行阻止SIGUSR1,但是它不起作用,它有一个无限循环,我找不到错误所在,也许我不太了解BLOCK的含义,但是使用
1回复

使用sigprocmask()的sigset_t Unix

我正在尝试使用printf打印sigset。 在此程序中,我使用了sigprocmask来阻止SIGHUP和SIGTERM。 将set初始化为空集后,oset将给出一些随机的十六进制字符串作为输出。 我应该如何解决这个问题? 另外,如果在执行后按Ctrl-C,则对程序的预期输出有疑问
1回复

sigprocmask后传递信号

我的印象是,使用sigprocmask()解除信号阻塞将导致待处理的阻塞信号被传递给进程。 在使用sigprocmask()解除阻塞信号的特定情况下,如果存在已经解除阻塞的待处理信号(例如SIGUSR1 ),则信号SIGUSR1将通过调用sigprocmask()解除阻塞另一个信号的方式传
1回复

在execvp()之前将忽略的信号设置为SIG_DFL

我正在编写一个库,在其中我fork()和execvp()启动另一个程序。 据我了解,execvX()将“自定义”信号处理程序重置为SIG_DFL,但它没有将任何忽略的信号处理程序设置为SIG_DFL。 请记住,这是一个库,我无法控制用户将如何处理信号,将忽略信号的信号处理程序设置为SIG