>>>В чем я не прав и почему так получается?
>>
>>Буквально недавно попадалось на глаза сообщение, прочтите:
>>http://gzip.rsdn.ru/forum/Message.aspx?mid=1421018&only=1
>
>
>ага, понятно, спасибо всем за советы!
>
>только вот почему все пишут, что перехватывать сигнал, это порочная практика или
>это бесполезно? Потому что после SIGSEGV-а состояние программы не определено - какая-то инструкция процессора не завершилась как положено.
>
>я вот написал перехватчик и все нормально, екзепшн ловит на сигнал SIGSEGV,
>я там обработать могу, в конце концов, к примеру, закрыть открытые
>дискрипторы файлов или сокетов...
Вот только попытка корректного выхода из программы и есть единсвенно возможное правильное действие. (Попытка, поскольку после SISEGVа программа ужв битая). Дескрипторы ОС сама закрывает - поэтому иногда самое лучшее решение просто позволить ей самой умереть без какой либо обработки сигнала.
>только почему все говорят, что так не очень хорошо?
>есть какие то скрытые проблеммы?
>
>и еще вопрос, если так в Юниксах работают странно catch, то как
>пишут тогда вообще нормально программы под Юниксы?
>Извините за вопрос, просто писал много под Винды и вообщем хорошим тоном
>считается try catch использовать, т.к. может произойти что угодно, особенно если
>проект огромный и работает круглые сутки и в котором не хотелось
>бы , чтоб вываливалась прога с диким криком, а хотелось бы
>чтоб хотя бы закрывалась корректно если что...
Программы надо писать так чтобы SIGSEGV-ы не случались. Если случилось - это все, конец, застрелись и умри. Если в программе "может произойти что угодно" - надо это "что угодно" предусмотреть и обработать как следует, не дожидаясь SIGSEGVа...
Точно так же как не стоит использовать exception для проверки и выхода из цикла по достижению конца массива, не надо для этого и SIGSEGV использовать.
А вообще, сигналы в Unix настолько же фундаментальны, как и message dispatch в windows gui. Надежные сервера обязательно перехватывают и корректно обрабатывают некоторые сигналы - SIGINT, SIGTERM, SIGCHILD если запускаются дочерние процессы, SIGPIPE если работают с сокетами... Это все стоит сначала хорошо изучить, а потом и посмотреть как на все это наложить семантику конкретного языка - C++ exceptions, например...