
- •Список сокращений
- •Введение
- •Понятие процесса
- •Взаимодействие пользователя с процессами
- •Информация о процессах
- •Иерархия процессов
- •Запуск процессов
- •Завершение процессов
- •Межпроцессное взаимодействие
- •Механизмы информационного обмена
- •Сигналы;
- •Сигналы
- •Неименованные каналы
- •Именованные каналы
- •Упражнения
- •Начало работы
- •Подготовка
- •Изучение процессов
- •Запуск и завершение процессов в командной оболочке:
- •Межпроцессное взаимодействие в командной оболочке
- •Межпроцесное взаимодействие
- •Сигналы в Linux
- •Индивидуальные задания
- •Контрольные вопросы
- •Список литературы
- •Приложение 1. Справка по используемым утилитам
- •Регулярные выражения
- •Утилита xargs
- •Утилита wc
- •Утилита awk
- •Приложение 2. Листинги используемых программ
Иерархия процессов
В отличии от ОС Windows, в которой процессы не имеют организованной структуры, подсистема управления процессами в ядре Linux построена по принципу ориентированного дерева: каждый процесс может быть запущен только одним из ранее запущенных процессов. В вершине дерева пользовательских процессов находится процесс-демон init (PID равный 1), который зачастую в современных дистрибутивах ОС Linux заменяется процессом-демоном systemd.
При запуске каждого нового процесса в ОС PID порождаемого процесса инкрементируется относительно PID последнего процесса, до тех пор, пока не будет достигнуто максимально возможное значение, хранящееся в файле «/proc/sys/kernel/pid_max». После этого счетчик сбрасывается, и инкрементация PID начинается заново.
Посмотреть существующие в системе процессы с отображением их иерархии и дополнительной информацией можно с помощью команды
|
ps -efH |
|
На Рисунке Рисунок 4 представлен фрагмент выводимого дерева процессов данной командой.
Рисунок 4. Фрагмент дерева процессов
В вершине дерева находится процесс init с полным именем исполняемого файла /sbin/init (PID равный 1), который располагается по данному пути в соответствии со стандартом POSIX. Данный процесс при старте проверяет конфигурационные файлы и порождает остальные процессы. Среди них есть процесс «/usr/sbin/sshd» (PID равный 453), который представляет собой процесс-демон (службу) для удаленного доступа к системе. Ввиду удаленного подключения к ОС через данную службу она имеет дочерний процесс «sshd: pi» (PID равный 868), где pi – имя пользователя, для которого было осуществлено подключение. Данный процесс так же имеет дочерний процесс, который отвечает за терминал ввода-вывода данных pts/0 (PID процесса равен 945). В процессе терминала создан дочерний процесс bash (PID равный 948), который представляет собой командную оболочку для интерпретации пользовательских команд. Каждый раз, когда пользователь взаимодействует с командной оболочкой и вводит новые команды, в ней порождаются новые дочерние процессы, которые, в свою очередь, тоже могу порождать новые дочерние процессы и так далее. Например, на Рисунке Рисунок 4 в командной оболочке была вызвана команда для просмотра дерева процессов «ps -efH», которая является дочерним процессом командной оболочки (PID равный 1050).
У каждого процесса в системе помимо его собственного PID есть так же информация о его родительском процессе – PPID (Parent Process Identifier). В случае, если родительский процесс завершился раньше дочернего, PPID у последнего изменяется на значение 1 (процесс init), поскольку данный процесс не может быть завершен до тех пор, пока работает ОС.
Запуск процессов
По умолчанию ввод каждой команды пользователем запускает дочерний процесс в командной оболочке «на переднем плане» – после порождения дочернего процесса командная оболочка блокируется и становится недоступна для ввода новых команд до тех пор, пока не будет завершен текущий дочерний процесс. При этом стандартные потоки ввода-вывода дочернего процесса перенаправляются в стандартные потоки ввода-вывода командной оболочки. Очевидно, что в таком режиме в одной командной оболочке невозможно запустить сразу несколько процессов, работающих квазипараллельно, что не позволяет в полной мере воспользоваться поддержкой многопроцессности ОС.
Одним из очевидных способов решения данной проблемы является порождение в ОС еще одного экземпляра командной оболочки с помощью еще одного терминала, однако это не всегда бывает возможно или удобно для пользователя. Однако в ОС Linux существует простой способ, позволяющий запускать процессы «в фоновом режиме» внутри командной оболочки. Для этого в конце любой команды необходимо поставить знак «&»:
|
<command> & |
|
Например,
|
cp -r /home/pi/data /home/ivan/data & # копирование данных в фоновом режиме |
|
После запуска процесса в фоновом режиме командная оболочка будет сразу доступна для ввода новых команд – стандартный поток ввода stdin дочернего процесса будет откреплен от командной оболочки. При этом стандартные выводы stdout и stderr дочернего процесса будут по-прежнему выводиться в терминал.
При запуске нового процесса в фоновом режиме в терминале появится сообщения формата
|
[jobspec] PID |
|
где jobspec – номер запущенного фонового процесса по порядку начиная с 1, а PID – идентификационный номер фонового процесса. При штатном завершении фонового процесса в терминале появится сообщение формата
|
[jobspec]+ Done <command> |
|
Просмотреть все запущенные фоновые процессы в данной командной оболочке можно с помощью команды
|
jobs -l |
|
Вернуть исполнение процесса из фонового режима на передний план можно с помощью команды
|
fg %jobspec% |
|
Если в командной оболочке запущен всего один фоновый процесс, то аргумент указывать не обязательно.