C/signal.h/SIGSEGV

Материал из C\C++ эксперт
Версия от 22:09, 21 июня 2010; Admin (обсуждение | вклад) (Новая страница: «Материал из Википедии — свободной энциклопедииПерейти к: навигация, поиск SIGSEGV Описание: …»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Материал из Википедии — свободной энциклопедииПерейти к: навигация, поиск SIGSEGV Описание: Исключение при обращении в память По умолчанию: завершение с дампом памяти коды SA_SIGINFO SEGV_MAPERR Обращение к незадействованной странице SEGV_ACCERR Нарушение прав доступа к странице

В POSIX-системах, SIGSEGV — сигнал, посылаемый процессу при попытке обращения к несуществующей памяти или обращения с нарушением прав доступа.

SIGSEGV — целочисленная константа, определённая в заголовочном файле signal.h. Символьные имена сигналов используются вместо номеров, так как в разных реализациях номера сигналов могут различаться.

SIG — общий префикс сигналов (от англ. signal), SEGV — англ. segmentation violation — нарушение сегментации.

На самом деле, современные Unix-подобные операционные системы (во всяком случае, на платформе i386) используют для управления памятью технологию страничного преобразования, вызывающую «страничные нарушения» и «нарушения защиты». Сегментация же (и порождаемые ею «нарушения сегментации») не используется, или используется в специфических трюках.

Использование

Система отображает память в адресное пространство процесса страницами размером 4—8 КБ (размер страницы зависит от аппаратной платформы, например в i386 это 4 КБ), по мере необходимости — по мере выделения памяти процессом. Также, в адресное пространство могут быть отображены:

  • файлы — подгрузка соответствующих частей файла (во временных страницах памяти) при обращении к области пространства, куда он отображён
  • разделяемая память — страницы памяти, одновременно отображаемые в несколько процессов
  • другие системные объекты

Страницы, в которые ещё ничего не отображено (а также «вытесненные» в процессе свопинга виртуальной памяти, или связанные с ещё незагруженными частями отображённого файла), вызывают страничное нарушение. Обрабатывая страничное нарушение для «вытесненной» страницы памяти, или незагруженной части файла, операционная система обеспечивает наличие страницы, вызывавшей нарушение, при следующем запуске процесса (и с «вытеснением» другой страницы, если это необходимо). Если же в странице адресного пространства ранее ничего отображено не было, то операционная система посылает процессу сигнал SIGSEGV, чтобы прекратить его выполнение.

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

Операционная система может предоставить дополнительные данные о возникшей ошибке, используя стек сигнала (англ. signal stack), который может помочь разработчику в отладке данной ошибки.

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

SIGSEGV может быть перехвачен или проигнорирован. Однако игнорирование SIGSEGV, в некоторых случаях, может привести к непредсказуемым результатам [1](англ.).

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