在Linux C守护进程中设置信号掩码

我用C写了一个简单的守护进程,运行在Linux上。 我想了解如何正确设置信号掩膜。 我在守护进程中有以下代码:

struct sigaction new_sig_action; sigset_t new_sig_set; /* Set signal mask - signals we want to block */ sigemptyset(&new_sig_set); sigaddset(&new_sig_set, SIGCHLD); /* ignore child - ie we don't need to wait for it */ sigaddset(&new_sig_set, SIGTSTP); /* ignore Tty stop signals */ sigaddset(&new_sig_set, SIGTTOU); /* ignore Tty background writes */ sigaddset(&new_sig_set, SIGTTIN); /* ignore Tty background reads */ sigprocmask(SIG_BLOCK, &new_sig_set, NULL); /* Block the above specified signals */ /* Set up a signal handler */ new_sig_action.sa_handler = signal_handler; sigemptyset(&new_sig_action.sa_mask); new_sig_action.sa_flags = 0; /* Signals to handle */ sigaction(SIGHUP, &new_sig_action, NULL); /* catch hangup signal */ sigaction(SIGTERM, &new_sig_action, NULL); /* catch term signal */ sigaction(SIGINT, &new_sig_action, NULL); /* catch interrupt signal */ 

signal_handler是一个已定义的函数。 我在这个线程中描述了一个停止守护进程的问题。

现在,我已经跟踪了在不同的环境(相同的用户,相同的系统)中启动守护进程时阻塞掩码不同的问题。 从命令行启动守护进程会产生以下“ps”输出:

 > ps -C powid -o pid,ppid,command,blocked,caught,ignored PID PPID COMMAND BLOCKED CAUGHT IGNORED 11406 1 ./powid 0000000000390000 0000000180004003 0000000000000000 

当通过PHP脚本启动完全相同的守护进程时,产生:

 > ps -C powid -o pid,ppid,command,blocked,caught,ignored PID PPID COMMAND BLOCKED CAUGHT IGNORED 11491 1 ./powid fffffffe3bfbe207 0000000180004003 00000000010010 

我的问题是,为什么阻塞的面具不同。 我的理解表明,给定的C代码将在所有条件下强制阻塞的掩码是相同的?

Solutions Collecting From Web of "在Linux C守护进程中设置信号掩码"

libc文档指出:

每个进程都有自己的信号掩码。 当你创建一个新的进程(参见创建进程)时,它会继承它的父进程的掩码。

所以答案是为什么阻塞的面具不同是因为父母曾经有不同的面具…

您给定的C代码一些信号添加到块列表,因为您使用sigprocmask并将第一个参数设置为SIG_BLOCK 。 如果要覆盖信号掩码,请使用SIG_SETMASK 。 有了这个,你应该得到一个父母独立的信号块掩码。