【问题标题】:Signal handling and sigemptyset()信号处理和 sigemptyset()
【发布时间】:2014-01-08 04:11:27
【问题描述】:

谁能用一种非常简单的方式解释一下 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);

}

【问题讨论】:

    标签: c process signals posix


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        名字说明了一切。 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定义的所有信号。

        【讨论】:

        • 这个名字说明了一切 - 实际上在这种情况下它是一个非常糟糕的名字。应该叫 sigset_empty 什么的。
        • 不,但可能是sig_emptyset。 POSIX 中signal.h 中定义的绝大多数函数都有一个sig 前缀来表示这一点。因此sigemptysetsignal.h 清空集合的实现。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-07
        • 2010-11-11
        相关资源
        最近更新 更多