C 我如何知道信号的当前状态

C 我如何知道信号的当前状态,c,signals,C,Signals,在C语言中,是否有一种方法可以了解有关信号的以下信息: 现在确定信号被阻断了吗 我们是否在信号处理函数chanin中(即,当前代码是否从函数调用,该函数被称为特定信号的信号处理程序)?如果是,我能知道当前信号是什么吗 谢谢首先,您可以使用带有空集指针的sigprocmask int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); a。如何设置为: SIG_UNBLOCK(集合中的信号将从当前阻塞信号集合中删除。尝试解除未

在C语言中,是否有一种方法可以了解有关信号的以下信息:

  • 现在确定信号被阻断了吗
  • 我们是否在信号处理函数chanin中(即,当前代码是否从函数调用,该函数被称为特定信号的信号处理程序)?如果是,我能知道当前信号是什么吗
  • 谢谢

    首先,您可以使用带有空集指针的sigprocmask

    int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
    
    a。如何设置为:
    SIG_UNBLOCK
    (集合中的信号将从当前阻塞信号集合中删除。尝试解除未阻塞信号的阻塞是合法的)

    b
    set
    可以设置为
    NULL
    (因为您不想更改阻塞的信号)

    c。如果
    oldset
    不是
    NULL
    ,则信号掩码的上一个值存储在oldset中。因此,在地址存储在oldset中的位置可以得到阻塞的信号

    其次,为了知道您是否在信号处理例程中,当您编写信号处理程序定义时,您可以接受int signum作为参数,如下所示:

    void mySignalHandler(int signum);
    
    如果您想知道,以便可以在该时间点阻止其他一些信号,您可以在开始时使用阻塞功能,在结束时使用解除阻塞功能(使用
    sigprocmask()
    )。您甚至可以将所述信号设置为
    SIG\u IGN
    状态,以便在处理当前信号时忽略它们(使用
    signal()

    最后,请阅读男士页面

    编辑: 因为作者说他确实读过这些函数,所以我建议使用apropos命令来查找这些难以找到的函数。比如说,

    $ apropos "blocked signals"
    
    提供大约5次点击,其中1次是
    sigprocmask


    干杯

    通过使用第二个参数null和第三个参数non-null调用,可以知道当前阻止了哪些信号(在这些条件下忽略第一个参数,因此传递零)。它将填充作为第三个参数提供的
    sigset\t


    我不知道堆栈上是否有信号处理程序帧。我想你也许可以使用
    \u Unwind.*
    函数系列,但这将是一个可怕的难题。

    浏览手册页,我开始怀疑你是否不需要跟踪自己……谢谢。事实上,我经常看手册页。我知道信号处理程序例程,最重要的可能是我不是这个函数的所有者,这就是我问这个问题的原因。我不知道sigprocmask函数。谢谢