Является ли int puts(const char*);
повторным входом? Могу ли я безопасно поместить его в обработчик сигналов?
Является ли put реентерабельным?
Ответы (2)
Здесь представлена таблица со всеми функциями, которые считаются безопасными для обработки сигналов:
«В следующей таблице определяется набор функций, которые должны быть либо реентерабельными, либо не прерываемыми сигналами и должны быть безопасными для асинхронных сигналов».
puts
в этом списке нет, однако согласно этому он считается реентерабельный, но не асинхронно-безопасный, возможно, поэтому его нет в вышеупомянутом списке.
person
Tony The Lion
schedule
09.05.2011
Хм, а где разница между
puts
и write
?
- person Šimon Tóth; 09.05.2011
@Let_Me_Be: точно не знаю, но
puts()
является частью stdio, который сам по себе не является безопасным для асинхронных сигналов. Возможно, помимо прочего, такие функции, как буферизация вывода.
- person Christian.K; 09.05.2011
@Christian Да, вы правы, я совершенно забыл, что весь stdio работает поверх структур
FILE
, а не файловых дескрипторов.
- person Šimon Tóth; 09.05.2011
Проблема заключается в буферизации памяти;
puts()
может буферизоваться, что может потребовать выделения нового буфера, что может потребовать вызова sbrk()
или mmap()
для выделения памяти. Эти две функции не безопасны для асинхронных сигналов. (Фактический базовый write()
для stdout FD в порядке.)
- person Donal Fellows; 09.05.2011
Нет, однако вы можете использовать write()
, безопасный для асинхронного сигнала, для вывода сообщений из обработчика сигнала:
#include <unistd.h>
const char* msg = "The message to print.";
write(STDOUT_FILENO, msg, strlen(msg));
person
Christian.K
schedule
09.05.2011
Безопасен ли сам
strlen()
асинхронный сигнал?
- person M.S. Dousti; 07.10.2018
Я думаю, что да. В следующей таблице определяется набор функций, которые должны быть безопасными для асинхронных сигналов. Поэтому приложения могут без ограничений вызывать их из функций захвата сигналов. ... и позже ... стрлен.
- person Christian.K; 08.10.2018
Спасибо за информацию!
- person M.S. Dousti; 08.10.2018