Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C程序中更改SIGTERM的含义_C_Linux_Signals_Sigterm - Fatal编程技术网

如何在C程序中更改SIGTERM的含义

如何在C程序中更改SIGTERM的含义,c,linux,signals,sigterm,C,Linux,Signals,Sigterm,我最近遇到了信号问题。我想用C写一个程序,在信号发送到进程后,它可以打印任何东西。例如:如果我将SIGTERM发送到我的进程(这只是运行程序),我希望程序打印出例如“killingtheprocessdenied”而不是killingtheprocess。那怎么做呢?如何强制进程捕获并更改此类信号的含义。我还有一个问题,是否有可能终止init进程(我知道这是一个愚蠢的问题,但我想知道linux是如何处理这种信号的,如果我键入:sudo kill-9 1不要使用信号处理程序来打印。你可以设置一个类

我最近遇到了信号问题。我想用C写一个程序,在信号发送到进程后,它可以打印任何东西。例如:如果我将SIGTERM发送到我的进程(这只是运行程序),我希望程序打印出例如“killingtheprocessdenied”而不是killingtheprocess。那怎么做呢?如何强制进程捕获并更改此类信号的含义。我还有一个问题,是否有可能终止init进程(我知道这是一个愚蠢的问题,但我想知道linux是如何处理这种信号的,如果我键入:
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。