Является ли put реентерабельным?

Является ли int puts(const char*); повторным входом? Могу ли я безопасно поместить его в обработчик сигналов?


person Šimon Tóth    schedule 09.05.2011    source источник


Ответы (2)


Здесь представлена ​​таблица со всеми функциями, которые считаются безопасными для обработки сигналов:

«В следующей таблице определяется набор функций, которые должны быть либо реентерабельными, либо не прерываемыми сигналами и должны быть безопасными для асинхронных сигналов».

puts в этом списке нет, однако согласно этому он считается реентерабельный, но не асинхронно-безопасный, возможно, поэтому его нет в вышеупомянутом списке.

person Tony The Lion    schedule 09.05.2011
comment
Хм, а где разница между puts и write? - person Šimon Tóth; 09.05.2011
comment
@Let_Me_Be: точно не знаю, но puts() является частью stdio, который сам по себе не является безопасным для асинхронных сигналов. Возможно, помимо прочего, такие функции, как буферизация вывода. - person Christian.K; 09.05.2011
comment
@Christian Да, вы правы, я совершенно забыл, что весь stdio работает поверх структур FILE, а не файловых дескрипторов. - person Šimon Tóth; 09.05.2011
comment
Проблема заключается в буферизации памяти; 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
comment
Безопасен ли сам strlen() асинхронный сигнал? - person M.S. Dousti; 07.10.2018
comment
Я думаю, что да. В следующей таблице определяется набор функций, которые должны быть безопасными для асинхронных сигналов. Поэтому приложения могут без ограничений вызывать их из функций захвата сигналов. ... и позже ... стрлен. - person Christian.K; 08.10.2018
comment
Спасибо за информацию! - person M.S. Dousti; 08.10.2018