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

2024-04-05

我用 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 - i.e. 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 是一个定义的函数。我在停止守护进程时遇到问题,如本节所述thread https://stackoverflow.com/questions/43889483/cannot-stop-c-daemon-in-certain-situations-from-php.

我现在已经跟踪到当守护进程在不同环境(同一用户,同一系统)中启动时块掩码不同的问题。从命令行启动守护进程会产生以下“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 代码将强制阻止的掩码在所有条件下都相同?


The libc 文档 https://www.gnu.org/software/libc/manual/html_node/Process-Signal-Mask.html states:

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

所以为什么被遮挡的口罩不一样的答案是因为父母曾经拥有不同的口罩......

你给定的C代码adds自从您使用以来,一些信号已发送至阻止列表sigprocmask第一个参数设置为SIG_BLOCK。如果要覆盖信号掩码,请使用SIG_SETMASK。这样,您最终应该得到一个独立于父级的信号块掩码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Linux C 守护进程中设置信号掩码 的相关文章

随机推荐