LINUX.ORG.RU

C++: сигналы раньше исключений?


0

0

Вот тестовая программка:

int main(int argc, char *argv[]) { ____try ____{ ________int *i = 0; ________cout << *i << endl; ____} ____catch ( ... ) ____{ ________cout << "Exception catched" << endl; ____} }

Если ещё перехватывать сигналы, оказывается, что сигнал SIGSEGV приходит раньше любого исключения. То же самое с SIGABRT. Досадно, что приходится держать два разных механизма перехвата исключительных ситуаций (ведь сигналы, как ни крути, исключительная ситуация). Кто подскажет, где я протупил?

★★★★

Насколько я понимаю исключение - это исключение:))

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

В принципе при такой идеалогии в раскрутке стека нет необходимости - в момент получения и обработки сигнала процесс находится в состоянии "ошибки" - и дальнейшие действия зависят от программиста.

В общем такое поведение накладывает сам Unix, и при необходимости отлавливать ошибки разименование пустого указателя/доступа к памяти при отсутствии прав без обработки сигналов необойтись:))

И толкование сигналов как исключительная ситуация не совсеим правильна. В случае с тем же SIGSEGV - он несет информацию о том что именно и где произошло. В случае SIGABORT - он генерится и от таймера, так что его тоже обрабатывать как исключение? Или если сигнал прислан другим процессом?

В общем IPC - это IPC а исключения языковое средство и нельзя их смешивать:))

Надеюсь у меня получилось объяснить:)))

tvn
()

вообще я бы не совсем согласился с tvn в части утверждения "в момент получения и обработки сигнала процесс находится в состоянии <ошибки>", т.к. процесс переходит в стадию обработки сигнала в момент выхода из системного вызова (перечень этих syscalls обычно дается в man'e). а это не совсем "состояние ошибки";) но в части "исключение - это исключение" - я буквально аплодирую;) и вообще, использование в коде исключений - дело вкуса и не всегда гладко переносится между различными платформами/компиляторами;) из-за этого многие предпочитают иметь дело с кодом ошибки;) с уважением, proff.

proff
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.