Правильный ответ действительно зависит от того, что вы собираетесь делать в цикле. Я предполагаю, что pause()
- это просто поддельный код, поскольку это не полезно.
Если цикл цикла событий, который ждет с select
или poll
, вы можете переключиться на pselect
(стандарт в POSIX) или ppoll
(нестандартное расширение, но лучше, так как select
API так плохо) то, что также позволит вы ждете сигналов. Но вы все еще придерживаетесь того, как получить уведомление о том, что сигнал произошел. Только с одним сигналом вы можете использовать тот факт, что EINTR
был возвращен, чтобы сделать вывод, что SIGINT
произошло, но это не работает так хорошо, если могут быть и другие обработчики сигналов. В основном обработка сигналов в основном глобальная, и как таковые глобальные переменные/глобальное состояние должны быть задействованы в некотором роде. Вы можете сохранить флаг, что сигнал произошел в глобальной переменной и каждый раз проверять его pselect
/ppoll
, или вы можете просто придерживаться простого стандарта poll
и использовать self-pipe trick, поскольку вам нужно что-то делать с глобальным состоянием в своем обработчик сигнала в любом случае.
Если ваш цикл не ждет событий, но постоянно вращается (например, вычислительный цикл), то просто блокирует сигнал (с sigprocmask
или pthread_sigmask
) и периодически проверять для него с sigispending
или sigwaitinfo
простым решением, которое не требует любой код в обработчике сигналов.
В этом конкретном случае работа с удалением цикла будет работать. –