Linux-сервер своими руками
Шрифт:
С помощью системного вызова kill можно сгенерировать сигналы и передать их другим процессам. Обычно kill используется для того, чтобы принудительно завершить («убить») процесс:
где: pid — идентификатор процесса;
snum — номер сигнала, который будет передан процессу (см. табл. 5.1).
Pid состоит из идентификатора группы процессов и идентификатора процесса в группе. Если вместо pid указать нуль, то сигнал snum будет направлен всем процессам, относящимся к данной группе (понятие группы процессов аналогично группе пользователей). В одну группу включаются процессы, имеющие общего предка. Идентификатор группы процесса можно изменить с помощью системного вызова setpgrp. Если вместо pid указать –1, то ядро передаст сигнал всем процессам, идентификатор пользователя которых равен идентификатору текущего выполнения процесса, посылающего сигнал. Номера сигналов приведены в табл. 5.1. Сигналы (точнее, их номера) описаны в файле signal.h.
Номера сигналов Таблица 5.1
Номер | Название | Описание |
---|---|---|
01 | SIGHUP | Освобождение
|
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 | Некорректный параметр системного вызова |
Для нормального завершения процесса используется вызов:
где status — это целое число, возвращаемое процессу-предку для его информирования о причинах завершения процесса-потомка.
Вызов exit может задаваться в любой точке программы, но может быть и неявным, например, при выходе из функции main (при программировании
на С) оператор return 0 будет воспринят как системный вызов exit(0).5.2. Перенаправление ввода/вывода
Практически все операционные системы обладают механизмом перенаправления ввода/вывода, и Linux не является исключением из этого правила. Обычно программы вводят текстовые данные с консоли (терминала) и выводят данные на консоль. При вводе под консолью подразумевается клавиатура, а при выводе — экран монитора. Клавиатура и экран монитора — это, соответственно, стандартный ввод и вывод (stdin и stdout). Любой ввод/вывод можно интерпретировать как ввод из некоторого файла и вывод в файл. Работа с файлами производится через их дескрипторы.
Для организации ввода/вывода в UNIX используются три файла: stdin (дескриптор 0), stdout (дескриптор 1) и stderr (дескриптор 2).
Символ > («больше») используется для перенаправления стандартного вывода в файл. Например:
В этом примере стандартный вывод команды cat будет перенаправлен в файл newfile.txt, который будет создан после выполнения этой команды. Если файл с этим именем уже существует, то он будет перезаписан. Нажатие Ctrl + D остановит перенаправление и прервет выполнение команды cat.
Символ < («меньше») используется для переназначения стандартного ввода команды. Например, при выполнении команды cat < file.txt в качестве стандартного ввода будет использован файл file.txt, а не клавиатура.
Символ >> используется для присоединения данных в конец файла (append) стандартного вывода команды. Например, в отличие от случая с символом >, выполнение команды cat >> newfile.txt не перезапишет файл в случае его существования, а добавит данные в его конец.
Чтобы перенаправить весь стандартный поток ошибок в какой-нибудь файл, используйте переадресацию 2> имя файла или 2>> имя файла. В первом случае стандартный поток ошибок будет передан в файл или на устройство, а во втором — поток ошибок будет добавлен в файл, если такой существует. При использовании переадресации 2>&1 стандартный поток ошибок будет перенаправлен на стандартный вывод интерпретатора Bourne (здесь 1 и 2 — дескрипторы файлов). Для перенаправления стандартного потока ошибок в файл вы можете также использовать переадресацию >& имя_файла (интерпретатор C-Shell).
В командных интерпретаторах Korn и C-Shell можно использовать переадресацию >! имя_файла. При этом файл не будет перезаписан, если он существует.
Символ | используется для перенаправления стандартного вывода одной программы на стандартный ввод другой. Например,
Можно также использовать переадресацию |&. В этом случае стандартный поток ошибок будет передан по каналу другой команде интерпретатора.
5.3. Команды управления процессами
Команда ps предназначена для вывода информации о выполняемых в текущий момент процессах. Данная команда имеет много параметров, о которых вы можете прочитать в руководстве (man ps). Здесь я опишу лишь наиболее часто используемые мною (см. табл. 5.2).
Параметры программы ps Таблица 5.2
Параметр | Описание |
---|---|
– а | Отобразить все процессы, связанные с терминалом (отображаются процессы всех пользователей) |
– е | Отобразить все процессы |
– t список_терминалов | Отобразить процессы, связанные с указанными терминалами |
– u идентификаторы_пользователей | Отобразить процессы, связанные с данными идентификаторами |
– g идентификаторы_групп | Отобразить процессы, связанные с данными идентификаторами групп |
– x | Отобразить все процессы, не связанные с терминалом |
Например, после ввода команды ps –а вы увидите примерно следующее:
Для вывода информации о конкретном процессе вы можете воспользоваться командой: