У меня есть обработчик сигнала для SIGABRT, когда сигнал получен, мне нужно еще немного времени для изящного выхода других потоков. Затем я выполню _exit () внутри обработчика сигнала, чтобы завершить весь процесс.

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

Кто-нибудь, пожалуйста, подскажите какие-нибудь идеи?

0
Lunar Mushrooms 31 Янв 2014 в 14:25

1 ответ

Лучший ответ

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

Обычно обработчик сигнала устанавливает флаг, сигнализирующий всем потокам о правильном выходе, возврате из обработчика сигнала и затем корректном завершении вашего кода.

0
Sergey L. 31 Янв 2014 в 14:27
Usleep () внутри SIGABRT делает его зависшим навсегда!
 – 
Lunar Mushrooms
31 Янв 2014 в 14:40
С usleep () внутри обработчика сигнала, какой поток перейдет в спящий режим? Или обработчик сигал заснет?
 – 
Lunar Mushrooms
31 Янв 2014 в 14:42
Поток, выполняющий обработчик сигнала, перейдет в спящий режим. Причина, по которой он может спать вечно, заключается в том, что тем временем могут поступать другие сигналы, которые прерывают этот сон и заставляют поток делать что-то еще. Реализация ОС полностью зависит от того, какой поток будет обрабатывать сигнал, как правило, случайный.
 – 
Sergey L.
31 Янв 2014 в 14:45
У меня есть два отпечатка до и после usleep (), один перед usleep () появляется. Но тот, который находится после usleep (), не появляется (). Это значит, что usleep () не прерывается, верно?
 – 
Lunar Mushrooms
31 Янв 2014 в 14:50
Это могло означать что угодно. Используйте отладчик, чтобы узнать, что именно происходит. Отладчик сможет сказать вам, что именно делает поток, а затем вы сможете выяснить, почему.
 – 
Sergey L.
31 Янв 2014 в 14:51