Вход/Регистрация
Основы программирования в Linux
вернуться

Мэтью Нейл

Шрифт:

Имена сигналов задаются с помощью включенного заголовочного файла signal.h. Они начинаются с префикса

SIG
и включают приведенные в табл. 11.3 сигналы.

Таблица 11.3

Имя сигнала Описание
SIGABORT
*Процесс аварийно завершается
SIGALRM
Сигнал тревоги
SIGFPE
*Исключение операции с плавающей точкой
SIGHUP
Неожиданный останов или разъединение
SIGILL
*Некорректная команда
SIGINT
Прерывание терминала
SIGKILL
Уничтожение (не может быть перехвачен или игнорирован)
SIGPIPE
Запись в канал без считывателя
SIGQUIT
Завершение работы терминала
SIGSEGV
*Некорректный доступ к сегменту памяти
SIGTERM
Завершение, выход
SIGUSR1
Сигнал 1, определенный пользователем
SIGUSR2
Сигнал 2, определенный пользователем

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

Если процесс получает один из этих сигналов без предварительной подготовки к его перехвату, процесс будет немедленно завершен. Обычно при этом создается файл с дампом ядра. Этот файл в текущем каталоге, названный core, представляет собой образ процесса, который может оказаться полезным при отладке.

К дополнительным относятся сигналы, приведенные в табл. 11.4.

Таблица 11.4

Имя сигнала Описание
SIGCHLD
Дочерний процесс остановлен или завершился
SIGCONT
Продолжить выполнение, если процесс был приостановлен
SIGSTOP
Остановить выполнение (не может захватываться или игнорироваться)
SIGTSTP
Сигнал останова, посылаемый с терминала
SIGTTIN
Фоновый процесс пытается читать
SIGTTOU
Фоновый процесс пытается писать

Сигнал

SIGCHLD
может быть полезен для управления дочерними процессами. По умолчанию он игнорируется. Остальные сигналы заставляют процессы, получившие их, остановиться, за исключением сигнала
SIGCONT
, который вызывает возобновление процесса. Они применяются программами командной оболочки для контроля работы и редко используются в пользовательских программах.

Чуть позже мы рассмотрим более подробно первую группу сигналов. Пока же достаточно знать, что если командная оболочка и драйвер терминала нормально настроены, ввод символа прерывания (обычно от нажатия комбинации клавиш <Ctrl>+<C>) с клавиатуры приведет к отправке сигнала

SIGINT
приоритетному процессу, т.е. программе, выполняющейся в данный момент. Это вызовет завершение программы, если в ней не предусмотрен перехват сигнала,

Если вы хотите отправить сигнал не текущей приоритетной задаче, а другому процессу, используйте команду

kill
. Она принимает для отправки процессу в качестве необязательного параметра имя сигнала или его номер и PID (который, как правило, можно определить с помощью команды ps). Например, для отправки сигнала "останов или разъединение" командной оболочке, выполняющейся на другом терминале с PID 512, вы должны применить следующую команду:

$ kill -HUP 512

Удобный вариант команды

kill
— команда
killall
, которая позволяет отправить сигнал всем процессам, выполняющим конкретную команду. Не все системы UNIX поддерживают ее, но ОС Linux, как правило, поддерживает. Этот вариант полезен, когда вы не знаете PID процесса или хотите отправить сигнал нескольким разным процессам, выполняющим одну и ту же команду. Обычное применение — заставить программу
inetd
перечитать параметры настройки. Для этого можно воспользоваться следующей командой:

$ killall -HUP inetd

Программы могут обрабатывать сигналы с помощью библиотечной функции

signal
.

#include <signal.h>

void (*signal(int sig, void (*func)(int)))(int);

Это довольно сложное объявление говорит о том, что

signal
— это функция, принимающая два параметра,
sig
и
func
. Сигнал, который нужно перехватить или игнорировать, задается аргументом
sig
. Функция, которую следует вызвать при получении заданного сигнала, содержится в аргументе
func
. Эта функция должна принимать единственный аргумент типа
int
(принятый сигнал) и иметь тип
void
. Функция сигнала возвращает функцию того же типа, которая является предыдущим значением функции, заданной для обработки сигнала, или одно из двух специальных значений:

SIG_IGN
— игнорировать сигнал;

SIG_DFL
— восстановить поведение по умолчанию.

Пример сделает все понятным. В упражнении 11.7 вы напишете программу ctrlc.c, которая реагирует на нажатие комбинации клавиш <Ctrl>+<C> вместо обычного завершения выводом соответствующего сообщения. Повторное нажатие <Ctrl>+<C> завершает программу.

Упражнение 11.7. Обработка сигнала

Функция

ouch
реагирует на сигнал, передаваемый в параметре
sig
. Эта функция будет вызываться, когда возникнет сигнал. Она выводит сообщение и затем восстанавливает обработку сигнала по умолчанию для сигнала SIGINT (генерируется при нажатии комбинации клавиш <Ctrl>+<C>).

  • Читать дальше
  • 1
  • ...
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: