是否有可能忽略所有的信号?(Is it possible to ignore all signals

2019-06-23 11:05发布

我有我想从我可以忽略任何信号停止保护服务器应用程序。 有没有办法忽略一次所有可能的信号,而无需通过一个设置它们吗?

Answer 1:

是:

#include <signal.h>

sigset_t mask;
sigfillset(&mask);
sigprocmask(SIG_SETMASK, &mask, NULL);

这不正是忽视的信号,但它们的块; 这在实践中是相同的效果。

我想没有必要提及的是SIGKILLSIGSTOP无法阻止,也没有以任何方式被忽略。

如需更详细的语义,比如面具继承规则之类的, 检查手册页



Answer 2:

阻塞信号是不一样的忽略它们。

当您阻止信号通过C2H5OH的建议,将其添加到待处理的信号队列,并会尽快你解锁,传递到进程。

解锁可以做到用

#include <signal.h>

sigset_t mask;
sigemptyset(&mask);
sigprocmask(SIG_SETMASK, &mask, NULL);

要回答你如何忽略信号的问题,它必须由信号处理程序是一个用户定义的函数,当一个信号传递到进程执行处理

static void foo (int bar)
{
     /*some code here. In your case, nothing*/
}

然后,通过使用注册该功能

signal(SIGINT,foo);   //or whatever signal you want to ignore

如果你想忽略所有的信号

int i;
for(i = 1; i <=31 ; i++)
{
   signal(i,foo);
}

此代码将传递到进程的所有信号,而忽略他们,而不是阻止他们的。

注:根据手册页,它不是推荐的方式,而不是sigaction的建议。 请检查出man sigaction



Answer 3:

基于解决方案sigprocmask()pthread_sigmask()并没有为我工作。 这是我发现的工作:

#include <signal.h>
#include <unistd.h>
#include <assert.h>
int main() {
    struct sigaction act;
    act.sa_handler = SIG_IGN;
    for(int i = 1 ; i < 65 ; i++) {
        printf("i = %d\n", i);
        // 9 and 19 cannot be caught or ignored                                                                                                       
        // 32 and 33 do not exist                                                                                                                     
        if((i != SIGKILL) && (i != SIGSTOP) && (i != 32) && (i != 33)) {
            assert(sigaction(i, &act, NULL) == 0);
        }
    }
    sleep(10000);
    return 0;
}


文章来源: Is it possible to ignore all signals?
标签: c unix signals