Почему из обработчика сигнала следует вызывать только асинхронно-безопасные функции?

Я понимаю, что из функции обработчика сигналов sigaction() я должен вызывать только те функции, которые являются "асинхронно-безопасными". Но почему так?


person Asif    schedule 22.09.2017    source источник


Ответы (1)


Вызов небезопасной функции может привести к неопределенному поведению.

Базовые спецификации Open Group, выпуск 7 (POSIX.1-2008), в его обработке "Концепции сигналов", говорит:

[W]когда сигнал прерывает небезопасную функцию... и функция, перехватывающая сигнал, вызывает небезопасную функцию, поведение не определено.

Что касается почему небезопасные функции небезопасны, то в данной реализации может быть много причин.

Однако предыдущая версия стандарта, выпуск 6 (POSIX.1-2004), намекает на одну возможную причину для некоторых реализаций. В этой версии безопасные для асинхронных сигналов функции описываются как или непрерываемый сигналами". Итак, рассмотрим функцию, которая полагается на статические данные для сохранения состояния, но прерывается сама по себе на полпути выполнения — можно ли доверять этим данным, когда управление возвращается к прерванной функции?

person pilcrow    schedule 27.09.2017