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

Мои вопросы:

  1. Есть ли способ окончательно определить, является ли функция асинхронно-сигнальной, если у вас нет доступ к его реализации?
  2. Если нет, есть ли способ проверить, будет ли функция достаточно асинхронно-сигнально-безопасной для вызова из обработчика сигнала?

Если вы читаете справочные страницы signal () или sigaction ( ), вы получите список функций, безопасных для асинхронных сигналов (функции, которые можно безопасно вызывать внутри обработчика сигналов). Однако я считаю, что этот список не является исчерпывающим. Например, следующая страница http: //linux.die.net / man / 7 / signal под заголовком Async-signal-safe functions читает:

POSIX.1-2004 (также известный как POSIX.1-2001 Technical Corrigendum 2) требует реализации, гарантирующей, что следующие функции могут быть безопасно вызваны внутри обработчика сигналов:

И затем он переходит к перечислению обычных безопасных для асинхронных сигналов функций, перечисленных на страницах руководства выше. Когда я его читал, там написано «это требуется», а не «это единственные».

Например, этот сайт говорит, что back_trace_symbols_fd () является безопасным для асинхронных сигналов. Эта функция получает данные из dladdr () и не использует malloc (), например back_trace_symbols (), поэтому похоже, что это может быть безопасно. Кроме того, я провел некоторое тестирование, и структура вывода dladdr () содержит переменные типа char *, но они НЕ блокируются во время выполнения. Строка символов, на которую они указывают, существует во время выполнения даже до вызова dladdr ().

Приветствуются любые мысли или идеи, которые могут указать мне правильное направление.

5
задан Roberto 26 January 2012 в 06:16
поделиться