Linux / Glibc.Могу ли я использовать fprintf в обработчике сигналов? - PullRequest
2 голосов
/ 29 декабря 2010

Могу ли я использовать fprintf(stderr) в обработчике сигналов (SIGALRM) с glibc / linux?

Ответы [ 2 ]

6 голосов
/ 29 декабря 2010

Нет, вы не можете. Проверьте на странице man * signal (7) список функций, безопасных для асинхронных сигналов. fprintf не входит в этот список.

Если вам не нужно форматирование, вы можете использовать write(STDERR_FILENO, <buf>, <buflen>) для записи в stderr.

4 голосов
/ 29 декабря 2010

Это небезопасно, цитируя статью IBM DeveloperWorks о Signal Handling Safety

Предположим, что обработчик сигнала печатает сообщение с помощью fprintf, и программа находилась в середине вызова fprintf, используя тот же поток, когда был доставлен сигнал. И сообщение обработчика сигнала, и данные программы могут быть повреждены, поскольку оба вызова работают с одной и той же структурой данных: самим потоком.

...