信号处理和sigemptyset()

use*_*819 18 c posix signals process

任何人都可以用一种非常简单的方式来解释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);

}
Run Code Online (Sandbox Code Playgroud)

Dev*_*lus 24

sigemptyset简单地将其初始化signalmask为空,以确保不会屏蔽任何信号.(即,将接收所有信号)基本上它类似于a memset(0)但您不必知道实现的细节.因此,如果sa_mask成员被更改,您不需要调整您的代码,因为它将被处理sigemptyset.


Duc*_*uck 8

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

您的实际困惑可能是 sigset_t 中固有的信号集用于什么,而答案是它们用于多种用途。您可能希望通过将一组传递给适当的调用来阻止一个调用中的多个信号。或者您可能想在一次调用中检查所有未决信号。简而言之,这取决于,但一组允许您一次性操作多个信号,而不是一系列连续的动作——这对于信号来说尤其成问题,因为它们是异步的并且受各种竞争条件的影响。