Сигналы можно рассматривать как программный аналог аппаратных прерываний. Они могут быть обработаны получающим процессом




старонка1/7
Дата канвертавання26.04.2016
Памер355.99 Kb.
  1   2   3   4   5   6   7

Сигналы

Введение


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

Сигналы можно рассматривать как программный аналог аппаратных прерываний. Они могут быть обработаны получающим процессом.


Сигналы


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

Сигналы могут генерироваться программно, с использованием системных вызовов kill(2) и sigsend(2). Хотя говорят, что сигналы посылаются от процесса к процессу, на самом деле они посылаются через ядро. Ещё один программный способ генерации сигналов — это системный вызов alarm(2), который позволяет установить будильник (alarm clock). Будильник в Unix — это сигнал, генерируемый ядром в заданный момент времени.

Кроме того, различные аппаратные события могут генерировать сигналы. Например, попытка записать значение по недопустимому виртуальному адресу или деление на ноль вынуждают ядро генерировать сигнал. Внешние события, такие, как разрыв линии связи или нажатие клавиши INTR (Ctrl-C по умолчанию), также могут быть причиной возникновения сигналов.

Процесс может определить действия, которые должны быть выполнены при получении сигнала. Такие действия называются реакцией на сигнал. Каждый сигнал имеет реакцию по умолчанию, которая выполняется, если для этого сигнала в этом процессе не были явно определены какие-то другие действия. Для большинства сигналов реакция по умолчанию — завершение процесса. Процесс имеет возможности либо проигнорировать сигнал, либо исполнить функцию обработки при его получении. Когда для определённого сигнала установлена реакция, она не меняется, пока не будет явным образом установлена другая реакция.

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

В традиционном Unix, процесс может распознать только один необработанный сигнал данного типа. Если второй сигнал того же типа возникнет прежде, чем первый сигнал будет обработан, второй сигнал будет потерян. Современные Unix-системы поддерживают надёжные сигналы, которые доставляются процессу столько же раз, сколько раз возникло соответствующее событие. Такие сигналы отличаются как по процедуре установки обработчика, так и по процедуре генерации (необходимо использовать функцию sigqueue(3C)). В этом курсе такие сигналы не изучаются.

Предупреждение: Будьте осторожны, используя сигналы для синхронизации процессов. Сигнал проявляет своё присутствие для процесса в дискретные моменты времени, в действительности — в моменты передачи управления от ядра к процессу, то есть в момент выхода из системного вызова или при возобновлении процесса планировщиком. Может оказаться, что процесс получит сигнал до или после того момента, когда он был бы готов обработать его.

Типы сигналов


Некоторые сигналы, их действия по умолчанию и события, которые их вызывают, перечислены на следующей странице. Все сигналы перечислены в signal(5); для всех сигналов определены символьные константы в . В соответствии со стандартом POSIX, рекомендуется использовать символические имена, а не численные значения номеров сигналов.

Сигналы от SIGHUP до SIGTERM генерируются ядром, когда возникает соответствующее событие. Сигналы SIGUSR1 и SIGUSR2 могут использоваться программистами для своих целей.

Пример посылки сигнала от ядра к вашей программе — использование клавиши INTR (Ctrl-C по умолчанию), при нажатии которой на терминале генерируется сигнал SIGINT. Ядро, обнаружив незаконное обращение к памяти в вашей программе, генерирует сигнал "нарушение сегментации" (segmentation violation) — SIGSEGV. Аналогично, деление на ноль с плавающей точкой генерирует сигнал "особая ситуации при работе с плавающей точкой (floating point exeption) SIGFPE. Этот же сигнал генерируется и при целочисленном делении на ноль.

Некоторые сигналы зависят от аппаратуры, такие, как SIGEMT и SIGBUS. Поэтому причины и значение этих сигналов могут меняться.



Не путайте аппаратные прерывания и исключения с сигналами. Некоторые аппаратные исключения обрабатываются ядром и иногда переводятся в сигналы, которые посылаются вашей программе.

сигнал

реакция

событие

SIGHUP

exit

обрыв линии (см. termio(7))

SIGINT

exit

прерывание (см. termio(7))

SIGQUIT

core

завершение (см. termio(7))

SIGILL

core

неправильная инструкция

SIGTRAP

core

прерывание трассировки

SIGABORT

core

аборт

SIGEMT

core

команда EMT (программное прерывание)

SIGFPE

core

арифметическая особая ситуация

SIGKILL

exit

принудительное завершение ("убийство")

SIGBUS

core

ошибка шины

SIGSEGV

core

нарушение сегментации

SIGPIPE

exit

разрыв конвейера

SIGALRM

exit

будильник

SIGTERM

exit

программный сигнал прерывания от kill

SIGCLD

ignore

изменение состояния подпроцесса

SIGPWR

ignore

сбой питания

SIGSTOP

stop

остановка (сигналом)

SIGTSTP

stop

остановка (пользователем) (см. termio(7))

SIGCONT

ignore

продолжение

SIGTTIN

stop

ожидание ввода с терминала(см. termio(7))

SIGTTOU

stop

ожидание вывода на терминал (см.termio(7))

SIGVTALRM

exit

сигнал виртуального таймера

SIGPROF

exit

сигнал таймера профилирования

SIGXCPU

core

исчерпался лимит времени (см. getrlimit(2))

SIGXFSZ

core

выход за пределы длины файла (см. getrlimit(2))



  1   2   3   4   5   6   7


База данных защищена авторским правом ©shkola.of.by 2016
звярнуцца да адміністрацыі

    Галоўная старонка