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