如何在C程序中更改SIGTERM的含义
我最近遇到了信号问题。我想用C写一个程序,在信号发送到进程后,它可以打印任何东西。例如:如果我将SIGTERM发送到我的进程(这只是运行程序),我希望程序打印出例如“killingtheprocessdenied”而不是killingtheprocess。那怎么做呢?如何强制进程捕获并更改此类信号的含义。我还有一个问题,是否有可能终止init进程(我知道这是一个愚蠢的问题,但我想知道linux是如何处理这种信号的,如果我键入:如何在C程序中更改SIGTERM的含义,c,linux,signals,sigterm,C,Linux,Signals,Sigterm,我最近遇到了信号问题。我想用C写一个程序,在信号发送到进程后,它可以打印任何东西。例如:如果我将SIGTERM发送到我的进程(这只是运行程序),我希望程序打印出例如“killingtheprocessdenied”而不是killingtheprocess。那怎么做呢?如何强制进程捕获并更改此类信号的含义。我还有一个问题,是否有可能终止init进程(我知道这是一个愚蠢的问题,但我想知道linux是如何处理这种信号的,如果我键入:sudo kill-9 1不要使用信号处理程序来打印。你可以设置一个类
sudo kill-9 1
不要使用信号处理程序来打印。你可以设置一个类型为volatile sig_atomic_t
的变量,并让你的主线程检查它(参见示例)
当主线程没有其他事情要做时(大多数情况下应该是这样),让它阻塞阻塞函数调用(例如sleep()
),该函数调用将在收到信号时立即唤醒(并将errno
设置为EINTR
)
C++gotcha:与C
sleep()
函数不同,std::this_thread::sleep_for()
(在glibc的最新版本中)在收到信号时不会唤醒
关于是否有可能杀死pid 1,请参阅。答案似乎是否定的,但我记得,当我用init=/bin/bash启动Linux并随后退出这个shell时,Linux变得非常暴躁,不得不硬重启
如果你想找麻烦,最好。checkout
sigaction
截取SIGTERM或SIGINT或其他信号。你不能改变SIGTERM本身的含义;你所能做的就是改变你的程序对接收信号的反应。你的进程(程序)会收到一些信号(SIGKILL和SIGSTOP)无法对此执行任何操作-进程无法更改对这些信号的默认反应。volatile
可能不够。us\u Atomic()
variables或sig_atomic_t
@Olaf,谢谢,添加了一个sig_atomic_t。考虑到这是针对Linux的,而不仅仅是标准C,信号处理程序中可以完成的事情要比标准C中允许的多得多。例如,在中可以使用一个系统调用列表。该列表有时是折衷的;write()
是允许的,但是strlen()
不是官方允许的。POSIX标准中有很多详细信息,例如at。