время реакции сигнала посикс

Каково разумное время реакции на сигналы 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 для запуска очистки и выхода из приложения. «проблема» в том, что если я установил таймер на слишком низкое значение, приложение увеличивает ядро, но если я установил слишком высокое значение, оно может быть убито или заметно замедлить процесс выключения.

2

Решение

Когда используешь init(8), сценарии в /etc/init.d/ используются для остановки процессов. Я считаю, что точный механизм, а также временные ограничения могут варьироваться от распределения к распределению. В моем случае время установлено на 3 секунды (вы можете найти его в /etc/rc.d/init.d/functions файл внутри killproc() функция. Так что 3 секунды — это верхний предел в целом.

Этот параметр также может быть переопределен скриптами запуска / остановки любого конкретного демона / приложения. Есть также альтернативы init.d, systemd например. Но я не уверен, как эта система работает, поэтому не могу сказать о таймаутах.

Я думаю, что 3 секунды более чем достаточно для остановки любого приложения — трудно представить, что может занять больше времени, чем это. В худшем случае — просто ведите несколько журналов, чтобы увидеть, вовремя ли это делает ваше приложение.

Надеюсь, поможет.

1

Другие решения

Вместо цикла опроса вы можете использовать сокеты с QSocketNotifier для преобразования сигналов posix в события Qt, как описано Вот.

1

По вопросам рекламы [email protected]