Сигналы в Linux: назначение и описание механизма

Сигналы в Linux

Хотя в предыдущем моем блоге сигналы были перечислены в качестве методов IPC, чаще всего они используются в широком разнообразии других контекстов, поэтому заслужи­вают более подробного рассмотрения.

Сигналы зачастую описываются как «программные прерывания». Поступление сиг­нала информирует процесс о том, что случилось какое-то событие или возникли исклю­чительные условия. Существует множество разнообразных сигналов, каждый из которых идентифицирует событие или условие. Каждый тип сигнала идентифицируется с помощью целочисленного значения, определяемого в символьном имени, имеющем форму SIGxxxx.

Сигналы отправляются процессу ядром, другим процессом (с соответствующими раз­решениями) или самим процессом. Например, ядро может отправить сигнал процессу, когда произойдет что-нибудь из следующего перечня:

  • пользователь набрал на клавиатуре команду прерывания (обычно это Ctrl+C);
  • завершился один из дочерних процессов данного процесса;
  • истекло время таймера (будильника), установленного процессом;
  • процесс попытался получить доступ к неверному адресу в памяти.

В оболочке сигнал процессу можно отправить с помощью команды kill. Внутри про­грамм ту же возможность может предоставить системный вызов kill().

Когда процесс получает сигнал, он, в зависимости от сигнала, выполняет одно из следующих действий:

  • игнорирует сигнал;
  • прекращает свою работу по сигналу;
  • приостанавливается, чтобы впоследствии возобновить свое выполнение с получением сигнала специального назначения.

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

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

Вас заинтересует / Intresting for you:

Основа операционной системы Li...
Основа операционной системы Li... 3031 просмотров Андрей Волков Wed, 09 Jan 2019, 05:36:45
Краткая история Linux
Краткая история Linux 2673 просмотров Андрей Волков Wed, 09 Jan 2019, 02:46:59
Процессы Linux
Процессы Linux 4556 просмотров Doctor Wed, 23 Jan 2019, 16:47:24
Спецсимволы в последовательнос...
Спецсимволы в последовательнос... 2365 просмотров Stas Belkov Tue, 29 Oct 2019, 15:13:02
Войдите чтобы комментировать

VaaPa аватар
VaaPa ответил в теме #10177 2 года 4 мес. назад
Благодарю за статью. Очень хорошо было бы развить тему...