С помощью системного вызова 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).
5.2. Перенаправление ввода/вывода