[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Взаимодействие процессов
Каждый процесс имеет родительский процесс (процесс 0 является
собственным родителем).
. Процесс 1 - /sbin/init процесс порождающий другие. Он читает
командный файл /etc/inittab (см. INITTAB(4)) и порождает процессы
(используя fork(2) и exec(2)). inittab определяет, какие процессы
должны быть порождены на конкретном уровне запуска системы. Он
обычно содержит /etc/rc2, который исполняется до того, как
пользователям будет позволено входить в систему. rc2 указывает,
какие файловые системы должны монтироваться и какие процессы-демоны
(daemon) должны быть запущены, например, планировщик работы
принтера. init порождает sac и ttymon для консоли.
. /usr/lib/saf/sac - контроллер доступа к сервису. Он стартует, когда
машина переводится в многопользовательский режим. Одна из функций
sac - чтение командного файла /etc/saf/_sactab и запуск
определенных в нем программ управления портами (ttymon). Далее sac
опрашивает эти программы на предмет обнаружение ошибок.
. /usr/lib/saf/ttymon определяет активность линии и выдает
приглашение входа в систему. ttymon пытается работать на начальном
уровне скорости. Если пользователь нажимает клавишу <BREAK>, ttymon
пытается использовать следующую скорость из последовательности,
определенной в файле /etc/ttydefs (см. TTYDEFS(4)). После ответа на
приглашение входа в систему, ttymon запускает /bin/login. Даже
после входа пользователя в систему владельцем процесса ttymon, по-
прежнему, остается root. Он был запущен не с вашего терминала и для
определения его статуса используйте ps -e.
. login проверяет регистрационное имя пользователя и его пароль. При
успешной проверке, login запускает поверх себя (overlays itself)
командный интерпретатор shell (по умолчанию /bin/sh), определенный
в файле passwd. login производит установку следующих переменных
среды исполнения:
HOME=шестое поле в файле паролей
LOGNAME=регистрационное имя пользователя
MAIL=/var/mail/регистрационное имя пользователя
PATH=/usr/bin
SHELL=седьмое поле файла паролей (установка происходит, только если
7-ое поле не равно нулю)
. После того как login запускает поверх себя shell, то shell сначала
читает команды из файла /etc/profile, а затем из файла
$HOME/.profile, если этот файл существует. Затем shell выдает
приглашение.
. Shell интерпретирует команды пользователей и выполняет их как
порожденные процессы.
Обычно запущенные с пользовательского терминала процессы, принадлежат
одной и той же сессии (session). Процессы одной сессии могут
принадлежать разным группам процессов. Процесс может создать новую
группу процессов (став лидером группы), вызвав setsid(2) или
setpgid(2). Порожденные процессы наследуют от родительского процесса
идентификаторы группы процессов и сессии. Один из процессов сессии,
управляемый с терминала (который называется управляющим терминалом),
принадлежит группе основных (foreground) процессов. Процессы из
группы основных процессов принимают сигналы, генерируемые клавиатурой
(например, SIGINT и SIGQUIT). Группы процессов и сессии важны для
управлениями заданиями и обработки сигналов.
В силу особенностей управления заданиями, ksh создает новую группу
процессов для каждой запускаемой команды. Иллюстрация на следующей
странице показывает четыре группы процессов. progc принадлежит группе
основных процессов. pgrpldr порождает два подпроцесса и они наследуют
идентификатор группы процессов от своего родителя. ksh использует
группы процессов для управления заданиями. Исполнение процесса из
группы основных процессов может быть остановлено вводом стоп-символа
(<CTRL z> по умолчанию). Потом ksh становится группой основных
процессов. Любые другие группы процессов могут стать основной группой
с помощью команды fg.
Группы процессов, сессии, группы основных процессов и управляющий
терминал будут обсуждаться более подробно в этом курсе дальше.