首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux进程可以阻止外部信号,但接受来自自己进程的信号吗?

问Linux进程可以阻止外部信号,但接受来自自己进程的信号吗?
EN

Stack Overflow用户
提问于 2012-01-30 22:19:23
回答 2查看 372关注 0票数 2

我正在尝试设置一个Linux进程,它阻止从kill命令(或任何其他进程)发送的SIGTERM,但允许从内部发送SIGTERM (通过kill(2)系统调用)。

有可能吗?

这是我写的一个示例程序,但是它SIG_BLOCKS了外部和内部信号,所以它不会做我想做的事情:

代码语言:javascript
复制
#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;
}

输出为:

代码语言:javascript
复制
Sleeping 30 secs, try killing me! (pid: 29416)
About to call kill
This never happens!

但它应该是:

代码语言:javascript
复制
Sleeping 30 secs, try killing me! (pid: 29416)
About to call kill

因为应该通过kill(getpid(), SIGTERM)从内部杀死该进程。

EN

回答 2

Stack Overflow用户

发布于 2012-01-30 22:27:09

不确定这是否是您想要的,但是您可以使用带有SA_SIGINFO标志的sigaction设置一个信号处理程序,让您的SIGTERM处理程序仅在siginfo.si_pid是您的PID时调用_exit

票数 4
EN

Stack Overflow用户

发布于 2013-01-09 00:55:18

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9065235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档