Теория и практика программирования на Си в Unix

Создание и разрушение процессов


Единственным способом создания процесса в системе UNIX является использование системного вызова fork (). Функционально, новый или порожденный процесс создается посредством копирования выполняемого или порождающего процесса. Порожденный процесс наследует большую часть атрибутов своего родителя, и в частности, открытые файлы (порожденный процесс обладает копией дескрипторов файлов, открытых его родителем). Особый процесс init является общим предком по отношению ко всем остальным. Он инициализирует совокупность администраторов системы (демонов) и связывает процесс с каждым терминалом. Системный вызов exec () позволяет запустить выполнение новой программы в рамках текущего процесса. Порождающий процесс может быть синхронизирован с порожденными благодаря функции wait (). Последние сигнализируют о своем окончании посредством обращения exit ().
Если порожденный процесс заканчивается раньше своего родителя, обработка данных производится следующим образом:
- если процесс-родитель находился в состоянии ожидания, обеспеченного функцией wait (), он выходит из этого состояния;
- если родителем не была задействована функция типа wait (), порожденный процесс остается в состоянии "зомби", т.е. он возвращает все ресурсы, приданные ему системой, но сохраняет свое местонахождение в таблице процессов до подачи сигнала о его окончании.
Если порождающий процесс закончился раньше своих преемников, приемным родителем последних становится процесс init ().

ПРОГРАММА 2 /*Пpимеp pаботы функции fork()*/ #include <stdio.h>

main() { /*создание (fork) пpоцесса */ switch (fork()) { case 0 : /*поpожденный пpоцесс */ printf(" fils pid %d ppid %d \n", getpid(), getppid()); exit(0); case -1 : /*ошибка*/ exit(1); default : /*поpождающий пpоцесс */ printf(" pere pid %d ppid %d \n", getpid(), getppid()); /*поpождающий пpоцесс ждет, пока не закончится поpожденный */ wait() ; exit(0); } }



Содержание раздела