Вызов стандартной библиотечной функции в обработчике сигнала - PullRequest
5 голосов
/ 17 марта 2010

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

Ответы [ 4 ]

11 голосов
/ 17 марта 2010

Это объясняется в документации GNU LibC .

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

И на всякий случай вот страница Википедии о реентерабельных функциях.

Компьютерная программа или подпрограмма описывается как повторно входящая, если ее можно безопасно вызвать снова до того, как ее предыдущий вызов был завершен (т.е. она может безопасно выполняться одновременно).

1 голос
/ 17 марта 2010

Все работает нормально и так далее, пока вы не столкнетесь с какими-то загадочными ошибками, которые невозможно отследить :)

man 7 signal выдаст вам список системных вызовов, которые можно безопасно вызывать из обработчика сигнала. Это также описано в POSIX.

1 голос
/ 17 марта 2010

Это не только проблемы повторного входа, в зависимости от того, какой сигнал является сервисом, вы также хотите избежать непреднамеренных вызовов malloc () (то есть asprintf ()) и другого расширения variadic (то есть printf ()).

0 голосов
/ 17 марта 2010

Поскольку библиотечная функция не может быть реентерабельной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...