Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
IT4.doc
Скачиваний:
8
Добавлен:
03.03.2016
Размер:
97.79 Кб
Скачать

3 Краткие теоретические сведения-

3.1 Системный вызов fork

Основным примитивом для создания процессов является системный вызов fork. Он является механизмом, который превращает Linux в многозадачную систему.

Описание

int pid = fork();

В результате успешного вызова fork ядро создает новый процесс, который является почти точной копией вызывающего процесса. Другими словами, новый процесс выполняет копию той же программы, что и создавший его процесс, при этом все его объекты данных имеют те же самые значения, что и в вызывающем процессе, за исключением значения, которое возвращает fork.

Созданный процесс называется дочерним процессом (child process), а процесс, осуществивший вызов fork, называется родителем (parent).

После вызова родительский процесс и его вновь созданный потомок выполняются одновременно, при этом оба процесса продолжают выполнение с оператора, который следует сразу же за вызовом fork.

Родитель и потомок отличаются значением переменной pid. Процесс-потомок в качестве возвращаемого значения системного вызова fork получает число 0, а процесс-предок – целое положительное число (идентификатор процесса-потомка, т.е. его уникальный номер). Так как возвращаемые в родительском и дочернем процессе значения различаются, то программист может задавать различные действия для двух процессов.

Значение, возвращаемое родительскому процессу в переменной pid, называется идентификатором процесса (process-id) дочернего процесса. Это число идентифицирует процесс в системе аналогично идентификатору пользователя. Поскольку все процессы порождаются при помощи вызова fork, то каждый процесс Linux имеет уникальный идентификатор процесса.

Программа может получить свой идентификатор процесса при помощи следующего системного вызова:

pid := getpid();

Аналогично вызов getppid возвращает идентификатор родителя вызывающего процесса:

ppid := getppid();

3.2 Системный вызов exit

Если процесс в результате своей работы выполнил до конца программу, определяющую его функционирование, или же другой, имеющий соответствующие полномочия процесс прервал его работу, то ОС выполнит очистку некоторых областей оперативной памяти, исключит его из планирования оперативной памяти и времени. Тем самым процесс прекратит свое существование.

Обычно причиной завершения функционирования процесса становится либо осуществление программой, выполняющейся в рамках этого процесса, системного вызова exit, либо выполнение оператора return, входящего в состав функции main этой программы.

Итак, процесс может завершить себя вызовом либо функции

void exit(int status);

либо функции

void _exit(int status);

Две формы, exit() и _ exit() отличаются тем, что exit() – функция библиотеки stdlib, а _exit() – системный вызов. (Функция exit() запускает системный вызов _exit()).

В результате осуществления системного вызова exit все открытые процессом или унаследованные им файлы будут закрыты, а процессу-предку (в том случае, если он в свое время осуществил системный вызов wait) будет возвращено значение, хранящееся в переменной status.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]