Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать
    1. Жизненный цикл сигналов

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

  1. Действие по умолчанию (SIG_DFL), которое может завершать, приостанавливать или возобновлять работу процесса, а также игнорировать сигнал.

  2. Игнорирование сигнала (SIG_IGN).

  3. Перехват сигнала и вызов функции-обработчика.

В большинстве случаев сигналы генерируются естественным путем - пользователем или системой. Например, операция деления на ноль порождает естественный сигнал SIGFPE, завершение дочернего процесса порождает естественный сигнал SIGCHLD. Но любой сигнал может быть сгенерирован искусственно, при помощи одного из пяти системных вызовов: kill, killpg, pthread_kill, raise и sigqueue. Между моментом рождения и моментом доставки сигнал находится на стадии ожидания. Поток может заблокировать сигнал в состоянии ожидания. Набор блокируемых сигналов называется маской сигналов. Для создания масок и управления ими существует целый ряд системных вызовов. Сигнал может быть послан как конкретному потоку, так и всему процессу. Реакция на сигнал относится ко всему процессу, даже если этот процесс исполняется в нескольких потоках.

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

Определено 28 различных сигналов, но большинство реализаций дополняют этот список своими сигналами:

  1. Обнаруженные ошибки:

  • SIGBUS - попытка доступа к неопределенной части памяти;

  • SIGFPE - ошибка арифметической операции;

  • SIGILL - некорректная команда;

  • SIGPIPE - запись в канал, из которого никто не читает;

  • SIGSEGV - недопустимое обращение к сегменту памяти;

  • SIGSYS - недопустимое обращение к системному вызову;

  • SIGXCPU - исчерпан лимит процессорного времени;

  • SIGXFSZ - превышено ограничение на размер файла.

  1. Генерируемые пользователем или приложением:

  • SIGABRT - обращение к системному вызову abort;

  • SIGHUP - обнаружен обрыв связи с терминалом или завершение терминального процесса;

  • SIGINT - прерывание работы;

  • SIGKILL - ликвидировать, может иметь только искусственное происхождение;

  • SIGQUIT - завершить с клавиатуры;

  • SIGTERM - завершить, может иметь только искусственное происхождение;

  • SIGUSR1 - сигнал пользователя № 1, имеет только искусственное происхождение;

  • SIGUSR2 - сигнал пользователя № 2, имеет только искусственное происхождение;

  1. Управление заданиями:

  • SIGCHLD - дочерний процесс завершил или приостановил работу;

  • SIGTTIN - попытка чтения из фонового процесса;

  • SIGTTOU - попытка записи из фонового процесса;

  1. События таймера:

  • SIGALRM - истекло время таймера;

  • SIGVTALRM - истекло время виртуального таймера;

  • SIGPROV - истекло время профилирующего таймера;

  1. Прочие события:

  • SIGPOLL – произошло ожидаемое событие;

  • SIGTRAP - ловушка трассировщика - точка останова;

  • SIGURG - доступны внеочередные данные в сокете.

Сигналы, обнаружения ошибок, имеющие естественную природу, являются результатом ошибок в программе. Сигналы SIGINT и SIGQUIT, обычно являются результатом нажатия определенной комбинации клавиш на клавиатуре. Сигнал SIGHUP, как правило, возникает при разрыве связи с терминальным устройством. Сигнал SIGABRT генерируется системным вызовом abort, а SIGTERM - командой kill - это основной способ принудительного завершения процессов, например, когда системный администратор дал команду на остановку системы. Сигналы SIGUSR1 и SIGUSR2 не генерируются системой и могут свободно использоваться для внутренних нужд приложения.

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