Мои вопросы:
- Есть ли способ окончательно определить, безопасна ли функция для асинхронных сигналов, если у вас нет доступа к ее реализации?
- Еслинет, есть ли способ проверить, достаточно ли безопасна функция асинхронного сигнала для вызова из обработчика сигнала?
Если вы читаете справочные страницы signal () или sigaction (), выполучить список асинхронно-безопасных функций (функций, которые можно безопасно вызывать в обработчике сигналов).Однако я считаю, что этот список не является исчерпывающим.Например, следующая страница http://linux.die.net/man/7/signal, в заголовке Асинхронно-безопасные функции гласит:
POSIX.1-2004 (также известный как POSIX.Техническое исправление 1-2001 2) требует реализации, гарантирующей, что следующие функции могут безопасно вызываться в обработчике сигналов:
И затем он переходит к списку обычных функций, безопасных для асинхронных сигналов, перечисленных встраницы руководства выше.Когда я читаю его, он говорит «это требует», а не «это единственные».
Например, этот сайт говорит, что back_trace_symbols_fd () безопасна для асинхронных сигналовЭта функция получает данные из dladdr () и не использует malloc (), как back_trace_symbols (), поэтому, похоже, она может быть безопасной.Кроме того, я провел некоторое тестирование, и выходная структура dladdr () содержит переменные char *, но они НЕ являются malloc'ed во время выполнения.Строка символов, на которую они указывают, существует во время выполнения даже до вызова dladdr ().
Любые мысли или идеи, которые могут указать мне правильное направление, приветствуются.