Книга: Linux-сервер своими руками
5.1.1. Общая схема управления процессами
5.1.1. Общая схема управления процессами
Каждый процесс может порождать полностью идентичный процесс с помощью fork(). Родительский процесс может дожидаться окончания выполнения всех своих процессов-потомков с помощью системного вызова wait. В любой момент времени процесс может изменить содержимое своего образа памяти, используя одну из разновидностей вызова ехес(). Каждый процесс реагирует на сигналы и, естественно, может установить собственную реакцию на сигналы, производимые операционной системой. Приоритет процесса может быть изменен с помощью системного вызова nice.
Сигнал — это способ информирования процесса ядром о происшествии какого-то события. Если возникает несколько однотипных событий, процессу будет подан только один сигнал. Сигнал означает, что произошло событие, но ядро не сообщает, сколько таких событий произошло.
Примеры сигналов:
1. Окончание порожденного процесса (например, из-за системного вызова exit (см. ниже)).
2. Возникновение исключительной ситуации.
3. Сигналы, поступающие от пользователя, при нажатии определенных клавиш.
Установить реакцию на поступление сигнала можно с помощью системного вызова signal:
func = signal(snum, function);
где: snum — номер сигнала;
function — адрес функции, которая должна быть выполнена при поступлении указанного сигнала.
Возвращаемое значение — адрес функции, которая будет реагировать на поступление сигнала. Вместо function можно указать ноль или единицу. Если был указан ноль, то при поступлении сигнала snum выполнение процесса будет прервано аналогично вызову exit. Если указать единицу, данный сигнал будет проигнорирован, но это возможно не для всех процессов.
С помощью системного вызова kill можно сгенерировать сигналы и передать их другим процессам. Обычно kill используется для того, чтобы принудительно завершить («убить») процесс:
kill(pid, snum);
где: pid — идентификатор процесса;
snum — номер сигнала, который будет передан процессу (см. табл. 5.1).
Pid состоит из идентификатора группы процессов и идентификатора процесса в группе. Если вместо pid указать нуль, то сигнал snum будет направлен всем процессам, относящимся к данной группе (понятие группы процессов аналогично группе пользователей). В одну группу включаются процессы, имеющие общего предка. Идентификатор группы процесса можно изменить с помощью системного вызова setpgrp. Если вместо pid указать –1, то ядро передаст сигнал всем процессам, идентификатор пользователя которых равен идентификатору текущего выполнения процесса, посылающего сигнал. Номера сигналов приведены в табл. 5.1. Сигналы (точнее, их номера) описаны в файле signal.h.
Номера сигналов Таблица 5.1
Номер | Название | Описание |
---|---|---|
01 | SIGHUP | Освобождение линии (hangup) |
02 | SIGINT | Прерывание (interrupt) |
03 | SIGQUIT | Выход (quit) |
04 | SIGILL | Некорректная команда (illegal instruction). He переустанавливается при перехвате |
05 | SIGTRAP | Трассировочное прерывание (trace trap). He переустанавливается при перехвате |
06 | SIGIOT или SIGABRT | Машинная команда IOT. Останов ввода/вывода |
07 | SIGBUS | Ошибка на шине |
08 | SIGFPE | Исключительная ситуация при выполнении операции с вещественными числами (floating-point exception) |
09 | SIGKILL | Уничтожение процесса (kill). He перехватывается и не игнорируется |
10 | SIGUSR1 | Определяемый пользователем сигнал 1 |
11 | SIGSEGV | Некорректное обращение к сегменту памяти (segmentation violation) |
12 | SIGUSR2 | Определяемый пользователем сигнал 2 |
13 | SIGPIPE | Запись в канал, из которого некому читать. Обрыв потока |
14 | SIGALRM | Будильник |
15 | SIGTERM | Программный сигнал завершения |
16 | SIGSTKFLT | Сбой стека |
17 | SIGCHLD (или SIGCLD) | Изменение статуса дочернего процесса |
18 | SIGCONT | Продолжение работы после сигнала STOP. He перехватывается и не игнорируется |
19 | SIGSTOP | Сигнал СТОП. Не перехватывается и не игнорируется |
20 | SIGTSTP | Сигнал останова клавиатуры |
21 | SIGTTIN | Фоновое чтение из терминала (tty) |
22 | SIGTTOU | Фоновая запись на терминал (tty) |
23 | SIGURG | Критическое состояние сокета |
24 | SIGXCPU | Превышенный предел процессорного времени |
25 | SIGXFSZ | Превышенный предел размера файла |
26 | SIGVTALRM | Сигнал виртуального будильника |
27 | SIGPROF | Сигнал профилирующего будильника |
28 | SIGWINCH | Изменение размера окна |
29 | SIGIO | Разрешение ввода/вывода |
30 | SIGPWR | Сбой питания |
31 | SIGSYS | Некорректный параметр системного вызова |
Для нормального завершения процесса используется вызов:
exit(status)
где status — это целое число, возвращаемое процессу-предку для его информирования о причинах завершения процесса-потомка.
Вызов exit может задаваться в любой точке программы, но может быть и неявным, например, при выходе из функции main (при программировании на С) оператор return 0 будет воспринят как системный вызов exit(0).
- Основные "рычаги" управления производительностью
- Категорийный менеджмент. Курс управления ассортиментом в рознице
- 1. Системы управления базами данных
- 4.8 Методы управления Fibre Channel
- 7.9 Будущее управления хранилищами по версии ассоциации SNIA: стандарты SMI
- 15.1.3. Обработка сигналов управления заданиями
- Группа управления конфигурацией ПО
- Системные вызовы управления процессорной привязкой
- Глава 2 Комбинированная система управления
- 1.1. Схема и основные этапы разработки новой продукции
- Почему я не нахожу в Панели управления описанных пунктов?
- Пять аспектов управления персоналом магазина