Я понимаю, что из функции обработчика сигналов sigaction()
я должен вызывать только те функции, которые являются "асинхронно-безопасными". Но почему так?
Почему из обработчика сигнала следует вызывать только асинхронно-безопасные функции?
Ответы (1)
Вызов небезопасной функции может привести к неопределенному поведению.
Базовые спецификации Open Group, выпуск 7 (POSIX.1-2008), в его обработке "Концепции сигналов", говорит:
[W]когда сигнал прерывает небезопасную функцию... и функция, перехватывающая сигнал, вызывает небезопасную функцию, поведение не определено.
Что касается почему небезопасные функции небезопасны, то в данной реализации может быть много причин.
Однако предыдущая версия стандарта, выпуск 6 (POSIX.1-2004), намекает на одну возможную причину для некоторых реализаций. В этой версии безопасные для асинхронных сигналов функции описываются как или непрерываемый сигналами". Итак, рассмотрим функцию, которая полагается на статические данные для сохранения состояния, но прерывается сама по себе на полпути выполнения — можно ли доверять этим данным, когда управление возвращается к прерванной функции?