posix信号反应时间

将意图退出申请的信号置于合理的反应时间是什么?

换句话说,在系统在关机,运行级别切换或其他自动化情况下杀死应用程序之前, sigintsigtermsigtstp处理可能需要多长时间?

我正在写一个非graphics化的qt应用程序,它必须响应信号才能在终止之前进行清理。 这是我目前的实现:

#include "posixsignals.h" #include <signal.h> QAtomicInt posixSignals::sig(0); posixSignals::posixSignals() { //connect to posix signals signal(SIGINT, posixSignals::interrupt); signal(SIGTSTP, posixSignals::interrupt); signal(SIGTERM, posixSignals::interrupt); //connect and start QTimer t connect(&t, SIGNAL(timeout()), this, SLOT(check())); t.start(500); } void posixSignals::interrupt(int signal) { sig.testAndSetOrdered(0,signal); } void posixSignals::check() { if(sig) emit signalCought(sig); } 

在实际的实现中,我将一些东西连接到signalCought信号,以触发应用程序的清理和退出。 这里的“问题”是如果我设置的定时器太低的应用程序最大的核心,但如果我把它设置得太高,它可能会被杀死或减缓关机过程明显。

当使用init(8) ,正在使用/etc/init.d/中的脚本来停止进程。 我相信确切的机制和时间限制可能会因分配而有所不同。 在我的情况下,时间设置为3秒(你可以在killproc()函数内的/etc/rc.d/init.d/functions文件中找到它,所以3秒是一般的上限。

这个参数也可以被任何特定守护进程/应用程序的启动/停止脚本覆盖。 也有替代init.dsystemd的例子。 但我不确定这个系统是如何工作的,所以不能告诉超时。

我认为3秒钟足以阻止任何应用程序 – 很难想象可能需要更长的时间。 在最糟糕的情况下 – 只是维护一些日志,看看你的应用程序是否按时发布。

希望能帮助到你。

如下所述,您可以使用带有QSocketNotifier的套接字将posix信号转换为Qt事件,而不是轮询循环。