не реентерабельная функция в обработчике сигналов? - PullRequest
4 голосов
/ 10 ноября 2009

рассматриваем обработчик сигнала, который вызывает exit () как последнюю инструкцию: безопасно вызывать не реентерабельные функции (например, free ()) в этом обработчике?

ИМХО это будет законно из-за того, что обработчик не возвращает к нормальной последовательности исполнения.

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 10 ноября 2009

Нет, это незаконно, более того, безопасных функций для вызова очень мало.

Существует список безопасных функций для вызова, см. http://linux.die.net/man/2/signal Раздел примечаний.

1 голос
/ 10 ноября 2009

Вы должны различать два сигнала: те, которые сообщают демону «перезагрузить», и те, которые завершают работу демона («убить»). В случае «убить» вам не нужно ничего освобождать. Ваш процесс умрет, ОС очистит все, что вы выделили. Если вы используете разделяемую память, вы должны выполнить очистку при повторном запуске. Не делайте в обработчике «kill» ничего, что могло бы вызвать проблемы. Просто умри.

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

0 голосов
/ 10 ноября 2009

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

Возможно, вы захотите обратиться к этой справочной странице .

...