C ++ SIGTERM не возвращается после того, как пойман - PullRequest
2 голосов
/ 17 мая 2011

Я пытаюсь поймать SIGTERM в моей программе, это проблема.

Моя программа запускается и настраивает прослушиватель для сигнала SIGTERM.Затем программа входит в цикл, который непрерывно проверяет дескриптор файла сокета, используя select, чтобы он не блокировался. Когда я отправляю программу TERM через kill, программа подтверждает, что она получает сигнал, но это не возвращает в цикл, который я описал ранее..

Обработчик сигнала устанавливает открытую переменную внутри класса, чтобы цикл знал о выходе.Я должен отметить, что в GDB это работает, но вне GDB это не так.

Заранее спасибо.

class A
{
    public:
        bool volatile stop;

    void loop();
    {
        while(!stop)
            {
                //check socket
            }
    }
};

A *aptr;

void sigterm_handler(int i)
{
    aptr->stop = true;
}

int main()
{
    A a;
    aptr = &a;
    struct sigaction sa;
    sa.sa_handler = &sigterm_handler;
    sigaction(SIGTERM, &sa, NULL);
    a.stop = false;
    a.loop();
}

РЕДАКТИРОВАТЬ: извините, код не был завершен правильно.

Ответы [ 4 ]

3 голосов
/ 17 мая 2011

Возможно, это связано с другими членами struct sigaction, которые не инициализированы. gdb может инициализировать память до 0, тогда как она не инициализируется без gdb.

3 голосов
/ 17 мая 2011

Вам нужно сделать stop "volatile", иначе компилятор фактически не проверит это в цикле, так как считает, что он не может измениться.

bool volatile stop;
0 голосов
/ 17 мая 2011

Как уже упоминалось выше, изменчивым является правильный ответ. Также я хотел бы добавить, что в соответствии с вашим кодом sigwait () будет лучшим решением вместо цикла ... Кстати, в случае sigwait вам не нужен обработчик сигнала

Оппс, извините пропустите операции сокета

0 голосов
/ 17 мая 2011

Вы можете обнаружить, что любой сигнал (особенно SIGTERM) прервет любые системные вызовы, которые вы делаете внутри цикла while.И под "системными вызовами" я подразумеваю все, что читает или выбирает или подключается к сокету.

Проверьте эту запись.

Также проверьтепример тестовой программы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...