Невозможно установить связь между обработчиком сигнала и остальной частью программы, используя локальные переменные.Никакие параметры не передаются в обработчик, кроме повышенного сигнала, и обработчик не возвращает значения.
Слова "глобальные переменные" несколько неоднозначны.Люди иногда имеют в виду разные вещи в зависимости от контекста.Если ваше ограничение применяется только к глобальной области, то просто используйте volatile sig_atomic_t
в некотором пространстве имен.Или используйте статическую переменную-член, если вы так предпочитаете.
Если ваше ограничение применяется к статической продолжительности хранения, вы можете вместо этого использовать локальную переменную потока.
Если ваше ограничение применяется ко всей глобальной памяти, тогда ваша проблема неразрешима с помощью обработчика сигнала.Вам просто нужна какая-то глобальная переменная.
Если вы можете полагаться на стандарт POSIX, а не на стандарт C ++, то способ обработки SIGINT
без глобальных переменных состоит в том, чтобы убедиться, что это не обработано, и заблокируйте нить с помощью sigwait
.Если вызов возвращает SIGINT
, остановите программу, в противном случае сделайте то, что вы хотите сделать с перехваченным сигналом.
Конечно, это означает, что блокирующий поток не делает ничего, кроме ожиданиядля сигналов.Вам нужно будет выполнить фактическую работу в других потоках.
Технически, хотя глобальная память, вероятно, все еще используется.Использование просто скрыто внутри системной библиотеки.
Более того, использование std::cout
в обработчике сигнала небезопасно.Я знаю, что это только пример, но "вызов внешней библиотеки для очистки" очень вероятно, что асинхронный сигнал небезопасен.
Это можно исправить, просто вызвав очистку вне цикла forа не внутри обработчика.
Основная проблема заключается в том, что я не могу настроить объявление signal()
для привязки к моему экземпляру MyClass::sig_handler
.
Это потому, что signal
требует указатель функции (типа void(int)
).Нестатические функции-члены не могут указываться указателями функций.Они могут указываться только указателями на функции-члены, которые signal
не принимает.