我有一个服务器应用程序,我想要保护免受任何信号,我可以忽略停止。 有没有办法一次忽略所有可能的信号,而不是一个一个地设置它们?
是:
#include <signal.h> sigset_t mask; sigfillset(&mask); sigprocmask(SIG_SETMASK, &mask, NULL);
这并不完全忽略这些信号,而是阻止它们。 这在实践中是相同的效果。
我想没有必要提到SIGKILL
和SIGSTOP
不能以任何方式被阻止或忽略。
有关更详细的语义,如掩码继承规则等, 请检查手册页
阻断信号和忽略信号是不一样的。
当您按照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; }