#c #signals #reentrancy
#c #сигналы #повторный вход
Вопрос:
Является int puts(const char*);
реентерабельным? Могу ли я безопасно поместить это в обработчик сигналов?
Ответ №1:
Здесь приведена таблица со всеми функциями, которые считаются безопасными для обработки сигналов:
«Следующая таблица определяет набор функций, которые должны быть либо реентерабельными, либо не прерываемыми сигналами и должны быть безопасны для асинхронных сигналов».
puts
похоже, его нет в этом списке, однако согласно этому, он считается входящим повторно, но не асинхронно-безопасным, возможно, поэтому его нет в вышеупомянутом списке.
Комментарии:
1. Хм, в чем разница между
puts
иwrite
?2. @Let_Me_Be: не знаю наверняка, но
puts()
является частью stdio, который сам по себе небезопасен для асинхронных сигналов. Возможно, но не ограничивается такими функциями, как буферизация вывода.3. @Christian Да, вы правы, я совершенно забыл, что весь stdio работает поверх
FILE
структур, а не файловых дескрипторов.4. Проблема заключается в буферизации памяти;
puts()
может буферизоваться, что может потребовать выделения нового буфера, что может потребовать вызоваsbrk()
илиmmap()
выделения памяти. Эти две функции не являются безопасными для асинхронного сигнала. (Хотя фактическая основаwrite()
для FD стандартного вывода в порядке.)
Ответ №2:
Нет, это не так, однако вы можете использовать write()
, который безопасен для асинхронного сигнала, для вывода сообщений из обработчика сигнала:
#include <unistd.h>
const char* msg = "The message to print.";
write(STDOUT_FILENO, msg, strlen(msg));
Комментарии:
1.
strlen()
Безопасен ли сам асинхронный сигнал?2. Я думаю , что это так. «Следующая таблица определяет набор функций, которые должны быть безопасны для асинхронного сигнала. Следовательно, приложения могут вызывать их без ограничений из функций улавливания сигналов.» … и позже … «strlen».
3. Спасибо за информацию!