После создания образ сыновнего процесса может быть заменен другим исполняемым образом. Разделы программного кода, данных и стеков, а также его «куча» памяти перезаписывается новым образом процесса. Новый процесс сохраняет свои идентификационные номера (PID и PPID). Атрибуты, сохраняемые новым процессом после замены его исполняемого образа, перечислены в табл. 3.3. В ней также указаны системные функции, которые возвращают эти атрибуты. Переменные среды также сохраняются, если во время замены исполняемого образа процесса не были заданы новые переменные среды. Файлы, которые были открыты до момента замены исполняемого образа, остаются открытыми. Новый процесс будет создавать файлы с теми же файловыми разрешениями. Время ЦП при этом не сбрасывается.
Таблица 3.3. Атрибуты, сохраняемые новым процессом после замены его исполняемого образа образом нового процесса
Идентификатор (ID) процесса
getpid
ID родительского процесса
getppid
ID группы процессов
getpgid
Сеансовое членство
getsid
Идентификатор эффективного пользователя
getuid
Идентификатор эффективной группы
getgid
Дополнительные ID групп
getgroups
Время, оставшееся до сигнала тревоги
alarm
Фактор уступчивости
nice
Время, используемое до настоящего момента
times
Маска сигналов процесса
sigprocmask
Ожидающие сигналы
sigpending
Предельный размер файла
ulimit
Предельный объем ресурсов
getrlimit
Маска создания файлового режима
umask
Текущий рабочий каталог
getcwd
Корневой каталог
Утилита pstree
Утилита pstree в среде Linux отображает дерево процессов (точнее, она отображает выполняющиеся процессы в форме древовидной структуры). Корнем этого дерева является процесс init.
pstree [-a] [-c] [-h | -Hpid] [-l] [-n] [-p] [-u] [-G] | -U] [pid | user]
pstree -V
При вызове этой утилиты можно использовать следующие опции,
-а Отобразить аргументы командной строки,
-h Выделить текущий процесс и его предков.
-H Аналогично опции -h, но выделению подлежит заданный процесс.
-n Отсортировать процессы с одинаковым предком по значению PID, а не
по имени,
-p Отобразить значения PID.
На рис. 3.10 показан результат выполнения команды pstree -h в среде Linux.
ka:~ # pstree -h
init-+-applix
|-atd
|-axmain
|-axnet
|-cron
|-gpm
|-inetd
|-9*[kdeinit]
|-kdeinit -+-kdeinit
| |-kdeinit---bash---gimp---script-fu
| '-kdeinit---bash -+-man---sh---sh---less
| '-pstree
|-kdeinit---cat
|-kdm-+-X
| '-kdm---kde---ksmserver
|-kflushd
|-khubd
|-klogd
|-knotify
|-kswapd
|-kupdate
|-login---bash
|-lpd
|-mdrecoveryd
|-5*[mingetty]
|-nscd---nscd---5*[nscd]
|-sshd
|-syslogd
|-usbmgr
'-xconsole
Ри с . 3.10. Результат выполнения команды pstree -h в среде Linux
Использование системной функции fork
Системная функция (или системный вызов) fork создает новый процесс, который представляет собой дубликат вызывающего процесса, т.е. его родителя. При успешном выполнении функция fork возвращает родительскому и сыновнему процессам два различных значения. Сыновнему возвращается число 0, а родительскому - значение PID сыновнего процесса. Родительский и сыновний процессы продолжают выполняться с инструкции, непосредственно следующей за функцией fork . В случае неудачного выполнения (оно выражается в том, что сыновний процесс не был создан) родительскому процессу возвращается число -1.
Синопсис
#include
pid_t fork(void); _
Неудачный исход функции fork возможен в случае, если система не обладает ресурсами для создания еще одного процесса. Это происходит при превышении ограничения (если оно существует) на количество сыновних процессов, которое может порождать родитель, или на количество выполняющихся процессов в масштабе всей системы. В этом случае устанавливается переменная errno, которая означает наличие ошибки.
Использование семейства системных функций exec