是否可以忽略所有信号?

Joó*_*dám 11 c unix signals

我有一个服务器应用程序,我希望防止被任何我可以忽略的信号停止.有没有办法一次性忽略所有可能的信号,而不是一个一个地设置它们?

C2H*_*5OH 15

是:

#include <signal.h>

sigset_t mask;
sigfillset(&mask);
sigprocmask(SIG_SETMASK, &mask, NULL);
Run Code Online (Sandbox Code Playgroud)

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

我想没有必要提及它SIGKILL,SIGSTOP不能以任何方式阻止或忽略.

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

  • @KerrekSB:您实际上可以捕获 SIGSEGV 和 SIGBUS,所以我想您也可以忽略它们。当然,风险由您自己承担。不过,[signal(7)](http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html)手册页只提到了“SIGSTOP”和“SIGKILL”。 (2认同)

gok*_*_uf 12

阻塞信号与忽略它们不同.

当您按照C2H5OH的建议阻止信号时,它会被添加到待处理的信号队列中,并在您解除阻塞后立即传送到进程.

解锁可以使用

#include <signal.h>

sigset_t mask;
sigemptyset(&mask);
sigprocmask(SIG_SETMASK, &mask, NULL);
Run Code Online (Sandbox Code Playgroud)

要回答关于如何忽略信号的问题,必须由信号处理程序处理,信号处理程序是用户定义的函数,只要信号传递给进程就会执行

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

然后使用注册此功能

signal(SIGINT,foo);   //or whatever signal you want to ignore
Run Code Online (Sandbox Code Playgroud)

如果你想忽略所有信号

int i;
for(i = 1; i <=31 ; i++)
{
   signal(i,foo);
}
Run Code Online (Sandbox Code Playgroud)

此代码将获取传递给进程的所有信号并忽略它们而不是阻止它们.

注意:根据手册页,它不是推荐的方式,而是建议使用sigaction.退房man sigaction


小智 5

解决方案基础上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;
}
Run Code Online (Sandbox Code Playgroud)