信号处理和sigemptyset()
任何人都可以用一种非常简单的方式来解释sigemptyset()的作用吗? 为什么有用? 我读了一堆定义,但我只是不明白。 从我收集的内容中,它跟踪用于阻止目的的信号? 我不太清楚我明白为什么那会有用。 是这样我们不能递归地得到那个特定的信号吗?
使用sigemptyset()的基本示例:
#include #include #include int main(){ struct sigaction act; sigemptyset(&act.sa_mask); act.sa_handler=function_name; act.sa_flags=0; sigaction(SIGINT, &act, 0); }
sigemptyset
只是将signalmask
sigemptyset
初始化为空,这样可以保证不会屏蔽任何信号。 (即,将接收所有信号)基本上它类似于memset(0)
但您不必知道实现的细节。 因此,如果更改了sa_mask
成员,则无需调整代码,因为它将由sigemptyset
。
退后一步。 sigset_t
是一个构造,表示通过某些系统调用(例如sigaction
)将采取某些操作的多个信号,但由于表示sigset_t
的数据结构是不透明的,因此需要一种可靠的方法来初始化它。 C中的局部变量不会自动初始化,您不能只假设sigset_t是一个整数类型并将其初始化为零,因为它可能是一个结构或一些其他未知类型。 因此,提供sigemptyset
和sigfillset
以可靠地清空(关闭所有信号)或填充(打开所有信号) sigset_t
表示。
您的实际混淆可能是sigset_t中固有的信号集所用的内容,而答案就是它们用于多种事物。 您可能希望通过将一组设置传递给适当的呼叫来阻止一个呼叫中的多个信号。 或者您可能想要在一次通话中检查所有待处理的信号。 简而言之,它取决于,但是一组允许您一次性操作多个信号而不是连续的一系列动作 – 这对于信号特别成问题,因为它们是异步的并且受各种竞争条件的影响。
这个名字说明了一切。 sigemptyset()
清空(描述一组变量的变量)。
那是
sigset_t ss; sigemptyset(&ss);
初始化sigset_t
类型的变量(此处为ss
)以“包含”无信号。
来自man sigemptyset
(Linux) :
sigemptyset()将set给出的信号集初始化为空,所有信号都从集合中排除。
[…]
必须通过调用sigemptyset()或sigfillset()来初始化sigset_t类型的对象,然后再传递给函数sigaddset() , sigdelset()和sigismember() […]
从POSIX规范 :
int sigemptyset(sigset_t *set);
[…]
sigemptyset()函数初始化set指向的信号集,以便排除POSIX.1-2008中定义的所有信号。