信号处理和sigemptyset()

时间:2013-12-19 14:30:27

标签: c process signals posix

有谁能请以非常简单的方式解释sigemptyset()的作用?为什么有用?我读了一堆定义,但我只是不明白。从我收集的内容中,它跟踪用于阻止目的的信号?我不太清楚我明白为什么那会有用。是这样我们不能递归地得到那个特定的信号吗?

使用sigemptyset()的基本示例:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

int main(){

struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_handler=function_name;
act.sa_flags=0;

sigaction(SIGINT, &act, 0);

}

3 个答案:

答案 0 :(得分:23)

sigemptyset只需将signalmask初始化为空,以确保不会屏蔽任何信号。 (即,将接收所有信号)基本上它类似于memset(0),但您不必知道实现的细节。因此,如果sa_mask成员发生了更改,则无需调整代码,因为sigemptyset将对其进行处理。

答案 1 :(得分:4)

退后一步。 sigset_t是一个构造,表示通过某个系统调用(例如sigaction)将采取某些操作的多个信号,但由于表示sigset_t的数据结构是不透明的,因此需要一种可靠的初始化方法。 C中的局部变量不会自动初始化,您不能只假设sigset_t是整数类型并将其初始化为零,因为它可能是结构或其他一些未知类型。因此,提供sigemptysetsigfillset以可靠地清空(关闭所有信号)或填充(打开所有信号)sigset_t表示。

您的实际混淆可能是sigset_t中固有的信号集所用的内容,答案就是它们用于多种事物。您可能希望通过将一组设置传递给适当的呼叫来阻止一个呼叫中的多个信号。或者您可能想要在一次通话中检查所有未决信号。简而言之,它取决于,但是一组允许您一次操作多个信号而不是一系列连续动作 - 这对于信号特别成问题,因为它们是异步的并且受各种竞争条件的影响。

答案 2 :(得分:2)

这个名字说明了一切。 sigemptyset()清空(描述)一组信号的变量。

那是

sigset_t ss;
sigemptyset(&ss);

sigset_t类型的变量(此处为ss)初始化为“包含”无信号。

来自man sigemptyset (Linux)

  

sigemptyset()将set给出的信号集初始化为空,所有信号都从集合中排除。

     

[...]

     

sigset_t类型的对象必须通过调用 sigemptyset() sigfillset()进行初始化,然后再传递给函数 sigaddset() sigdelset() sigismember() [...]

来自POSIX specs

int sigemptyset(sigset_t *set); 
     

[...]

     

sigemptyset()函数初始化set指向的信号集,以便排除POSIX.1-2008中定义的所有信号。