2016-03-04 2 views
0

У меня есть тестовая программа для части библиотеки C, где я обрабатываю сигналы. В этой тестовой программе много кода - настолько, что я чувствую, что публикация здесь будет затруднять ответ на мой вопрос.SIGSEGV отправлен дважды - программа аварийных ситуаций после обработки

В основном то, что происходит, заключается в том, что я заставляю систему отправлять мне SIGSEGV внутри фонового потока. Я обрабатываю этот сигнал, а затем тест закончен. Основной поток будет ждать этого, а часть обработчика сигнала - перезапустить основной поток. Когда основной поток перезагружается Я восстанавливаю обработчик сигнала по умолчаниюsignal(SIGSEGV, SIG_DFL), а затем получаю другой SIGSEGV.

Я понимаю, что у меня много кода, и это вполне может быть моей ошибкой, но есть ли общее объяснение того, почему SIGSEGV будет стрелять дважды? Этого не происходит, когда я вызываю другие сигналы (хотя я их не пробовал).

Чтобы уточнить, что я на OS X, пишу на C, компилируя с gcc.

ответ

0

Если у вас есть проблемы внутри обработчика сигнала, например, перезапись памяти, попытка доступа за пределы выделенной области, то будет поднят новый сигнал. Подробную информацию см. На следующей странице.

http://www.gnu.org/software/libc/manual/html_node/Signals-in-Handler.html

Вы также должны использовать реентрантные функции внутри обработчиков сигналов, например localtime_r вместо МестноеВремя.

Кроме того, вместо сигнала() следует использовать sigaction().

Подробнее здесь: What is the difference between sigaction and signal?

Смежные вопросы