【发布时间】:2012-01-30 14:19:22
【问题描述】:
我正在尝试设置一个 Linux 进程,它会阻止从 kill 命令(或任何其他进程)发送的 SIGTERM,但允许从自身内部发送 SIGTERM(通过 kill(2) 系统调用)。
有可能吗?
这是我编写的一个示例程序,但它SIG_BLOCKS 既有外部信号也有内部信号,所以它没有做我想做的事情:
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
sigset_t sigs;
sigemptyset(&sigs);
sigaddset(&sigs, SIGTERM);
sigprocmask(SIG_BLOCK, &sigs, 0);
printf("Sleeping 30 secs, try killing me! (pid: %d)\n", getpid());
sleep(30);
printf("About to call kill\n");
kill(getpid(), SIGTERM);
printf("This never happens!\n");
return 1;
}
输出是:
Sleeping 30 secs, try killing me! (pid: 29416)
About to call kill
This never happens!
但应该是:
Sleeping 30 secs, try killing me! (pid: 29416)
About to call kill
因为应该通过kill(getpid(), SIGTERM) 从内部杀死进程。
【问题讨论】:
-
具体来说,您想要完成什么? (不是如何,而是what。)
-
@pilcrow :这是一个我想和朋友解决的理论问题。他说,如果一个外部进程不能杀死一个进程,那么一个进程也不能杀死自己。我想向他展示您可以设置信号处理程序,即外部信号将被忽略但内部信号(来自应用程序本身)将被接受。