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

Мои вопросы:

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

Если вы читаете справочные страницы 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 ().

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

Ответы [ 2 ]

4 голосов
/ 26 января 2012

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

Нет 100% надежного способа проверить, является ли функция асинхронной.Помните, что тестирование может показать только наличие ошибок, а не их отсутствие (Дейкстра).Сам факт того, что вам не удается превратить функцию в ненадлежащее поведение при тестировании, может просто означать, что ваше тестирование неадекватно (но будьте уверены, важный клиент, которого вы не можете позволить себе обидеть, немедленно и случайно разработает чрезвычайно эффективныйтест, демонстрирующий, что функция не является асинхронной почти сразу же после выпуска кода с ошибочным допущением).

0 голосов
/ 26 января 2012

Чего вы надеетесь достичь в обработчике сигналов? Вы должны рассмотреть, является ли это правильным местом для этого. Вероятно, лучше всего следовать советам справочной страницы:

In general, signal handlers should do little more  
than set a flag; most other actions are not safe.
...