是否可以忽略所有信号?

我有一个服务器应用程序,我想要保护免受任何信号,我可以忽略停止。 有没有办法一次忽略所有可能的信号,而不是一个一个地设置它们?

是:

#include <signal.h> sigset_t mask; sigfillset(&mask); sigprocmask(SIG_SETMASK, &mask, NULL); 

这并不完全忽略这些信号,而是阻止它们。 这在实践中是相同的效果。

我想没有必要提到SIGKILLSIGSTOP不能以任何方式被阻止或忽略。

有关更详细的语义,如掩码继承规则等, 请检查手册页

阻断信号和忽略信号是不一样的。

当您按照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。 检查出人的信号

基于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; }