2016-11-19 48 views
-2

我最近遇到了一个信号问题。我想用C编写一个程序,它会在信号发送到进程后打印任何东西。例如:如果我发送SIGTERM到我的进程(这只是运行程序),我希望程序打印出例如“杀死进程被拒绝”而不是杀死进程。那么该怎么做?如何强制过程捕捉和改变这种信号的含义。我还有一个问题,如果有任何可能杀死init进程(我知道这是一个愚蠢的问题,但我想知道linux如何处理这样的信号,以及如果我输入:sudo kill -9 1如何更改C程序中SIGTERM的含义

+2

签出'sigaction'来截取SIGTERM或SIGINT或其他信号。 –

+2

您无法更改SIGTERM本身的含义;你所能做的就是改变你的程序对收到信号的反应。有一些信号(SIGKILL和SIGSTOP)表示你的进程(程序)无法做任何事情 - 进程无法改变对这些信号的默认响应。 –

回答

0

请勿使用信号处理程序进行打印。你可以设置volatile sig_atomic_t类型的变量来代替,和你的主线程检查这个(见this例子)。

当你的主线程有没有别的事可做(这应该是大部分时间),让它阻塞一个阻塞函数调用(例如sleep()),它将在收到信号时立即唤醒(并设置errnoEINTR)。


C++疑难杂症:与C sleep()功能,std::this_thread::sleep_for()(在最新版本的glibc)不唤醒接收到信号时。


至于是否有可能杀PID 1,看this question。答案似乎是没有,但我记得当我用init =/bin/bash启动后,Linux变得非常暴躁,后来退出了这个shell - 必须重新启动。

如果你正在寻找麻烦,更好kill pid -1

+0

'volatile'可能不够用。无论是我们'_Atomic()'变量还是'sig_atomic_t'。 – Olaf

+0

@Olaf,谢谢,添加了一个sig_atomic_t。 – user2394284

+0

鉴于这是针对Linux的,而不是标准C,所以在信号处理程序中可以做的事情要比标准C中允许的要多得多。有一系列系统调用可用于[如何避免使用printf()例如,在一个信号处理程序中(http://stackoverflow.com/questions/16891019/)。该名单有时是折衷主义的; 'write()'是允许的,但'strlen()'不正式。例如,POSIX标准中有更多的细节信息 - [Signal Concepts](http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04)。 –

相关问题