【问题标题】:Can a Linux process block external signals but accept signals from its own process?Linux 进程可以阻止外部信号但接受来自自己进程的信号吗?
【发布时间】: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 :这是一个我想和朋友解决的理论问题。他说,如果一个外部进程不能杀死一个进程,那么一个进程也不能杀死自己。我想向他展示您可以设置信号处理程序,即外部信号将被忽略但内部信号(来自应用程序本身)将被接受。

标签: linux process signals


【解决方案1】:

不确定这是否是您所追求的,但您可以使用带有SA_SIGINFO 标志的sigaction 设置信号处理程序,让您的SIGTERM 处理程序仅在siginfo.si_pid 是您的情况下调用_exit PID

【讨论】:

  • 非常有趣。我会试试这个。
  • +1 这是模拟 OP 想要的语义的最接近的方法。
【解决方案2】:

根据我的测试,如果您不屏蔽信号。您可以看到预期的行为。

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

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 2016-05-27
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    相关资源
    最近更新 更多