2

アプリケーションを終了することを意図しているposixシグナルに対する妥当な反応時間はどれくらいですか?

言い換えると、シャットダウン、ランレベルの切り替え、またはその他の自動化された状況でシステムがアプリケーションを強制終了するまでに、sigint、sigterm、またはsigtstpの処理どのくらい時間がかかるでしょうか。

終了する前にクリーンアップするためにシグナルに応答する必要がある非グラフィカル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 に答える