Linux进程可以阻止外部信号但是接受来自其自身进程的信号吗?

时间:2012-01-30 14:19:23

标签: linux process signals

我正在尝试设置一个Linux进程,它阻止从SIGTERM命令(或任何其他进程)发送的kill,但允许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)从内部被杀死。

2 个答案:

答案 0 :(得分:3)

不确定这是否属于您之后的情况,但您可以使用sigaction标记SA_SIGINFO设置信号处理程序,让SIGTERM处理程序只调用{ {1}}如果_exit是您的PID

答案 1 :(得分:0)

根据我测试的内容,如果你不阻止信号。你可以看到预期的行为。

但是如果您阻止了信号,则kill将返回值0,并且由于程序继续执行,它将打印该行并退出。我正在使用ubuntu 12.04LTS进行测试。