2

对打算退出应用程序的 posix 信号的合理反应时间是多少?

换句话说,我的sigintsigtermsigtstp处理可能需要多长时间才能在系统关闭、运行级别切换或其他自动化情况下终止应用程序?

我正在编写一个非图形 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 信号以触发应用程序的清理和退出。这里的“问题”是如果我将计时器设置得太低,应用程序会最大化核心,但如果我将其设置得太高,它可能会被杀死或显着减慢关机过程。

4

2 回答 2

1

使用 时init(8),其中的脚本/etc/init.d/用于停止进程。我相信确切的机制和时间限制可能因发行版而异。在我的情况下,时间设置为 3 秒(您可以在函数/etc/rc.d/init.d/functions内部的文件中找到它killproc()。所以 3 秒通常是一个上限。

此参数也可以被任何特定守护程序/应用程序的启动/停止脚本覆盖。init.d例如,还有其他选择systemd。但我不确定该系统是如何工作的,因此无法判断超时。

我认为 3 秒足以停止任何应用程序 - 很难想象还有什么比这更长的时间。在更糟糕的情况下——只需维护一些日志以查看您的应用程序是否按时完成。

希望能帮助到你。

于 2012-11-08T22:16:53.003 回答
1

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

于 2012-11-08T22:53:22.107 回答