Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект Лекций ПСРВ.doc
Скачиваний:
81
Добавлен:
12.02.2016
Размер:
2.73 Mб
Скачать

7.3.3. Функции семейства spawn*()

В отличие от функций семейства exec*() функции семейства spawn*() способны создавать новый (дочерний) процесс со своим pid, параллельно выполняющийся вместе с родительским процессом. Если родительский процесс каким-то образом завершается, то это не означает, что ядро по этой причине должно сразу завершить и дочерний процесс. Имеется возможность с помощью флагов управлять поведением процесса-родителя после запуска дочернего процесса:

P_WAIT

родительский процесс блокируется до тех пор, пока дочерний процесс не завершится;

P_NOWAIT

родительский процесс не блокируется, выполняется параллельно с дочерним процессом и должен ожидать завершения дочернего процесса;

P_NOWAITO

родительский процесс не блокируется, выполняется параллельно с дочерним процессом и не должен ожидать завершения дочернего процесса (гарантирует от перехода дочернего процесса в DEAD-блокированное состояние - "зомби", при его завершении);

P_OVERLAY

родительский процесс заменяется дочерним процессом как при вызове функций семейства exec*();

В качестве примера рассмотрим функции spawnl() и spawnve() семейства spawn*().

Объявление функции spawnl() имеет вид:

#include <process.h>

int spawnl( int mode,

            const char * path,

            const char * arg0,

            const char * arg1...,

            const char * argn,

            NULL );

Аргумент mode предназначен для задания флага управления поведением родительского процесса. Предназначение остальных аргументов то же, что и у функции execl().

Возвращаемое функцией spawnl() значение зависит от значения флага в аргументе mode:

Значение mode

Возвращаемое значение

P_WAIT

Статус завершения дочернего процесса.

P_NOWAIT

PID дочернего процесса. Чтобы получить статус завершения дочернего процесса родительский процесс должен выполнить функцию waitpid(), которой в качестве параметра передается полученный PID дочернего процесса.

P_NOWAITO

PID дочернего процесса., или 0, если дочерний процесс стартовал на удаленном узле. Статус завершения такого дочернего процесса получить невозможно.

В случае ошибки возвращается -1 (устанавливается errno).

Пример.

#include <stddef.h>

#include <process.h>

 

int exit_val;

...

exit_val = spawnl( P_WAIT, "myprog",

                   "myprog", "ARG1", "ARG2", NULL );

...

 

Объявлениефункцииspawnve() имеетвид:

#include <process.h>

int spawnve(int mode, const char * path, char * const argv[], char * const envp[] );

Аргумент argv есть указатель на вектор аргументов. Значение argv[0] должно указывать на имя файла исполняемого модуля. Последний член argv должен быть NULL указатель. Значение argv и argv[0] не могут быть NULL указателем, даже если не требуется передавать какие-либо аргументы запускаемому процессу.

Аргумент envp есть указатель на массив указателей на строки, определяющие переменные среды. Массив должен завершаться NULL указателем. Определение переменной среды задается в форме:

 

"имя_переменной=значение_переменной"

 

Если значение envp равно NULL, то дочерний процесс наследует среду родительского процесса. Дочерний процесс при этом может осуществить доступ к переменным среды, используя глобальную системную переменную environ (определена в <unistd.h>).

Возвращаемое функцией spawnve() значение формируется по тем же правилам, что и у функции spawnl().

 

Пример:

 

#include <stddef.h>

#include <process.h>

 

char* arg_list[] = { "myprog", "ARG1", "ARG2", NULL };

char* env_list[] = { "SOURCE=MYDATA",

"TARGET=OUTPUT",

"lines=65",

NULL

};

int exit_val;

...

exit_val = spawnve( P_WAIT,"myprog",arg_list,env_list);

...