Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по функциям С++.doc
Скачиваний:
168
Добавлен:
02.05.2014
Размер:
3.57 Mб
Скачать

Spawn...

-----------------------------------------------------------------

НазначениеСоздает и запускает порожденный процесс

Синтаксис #include <process.h>

#include <stdio.h>

int spawnl(int mode, char *path, char

*arg0, arg1, ...,argn, NULL);

int spawnle(int mode, char *path, char

*arg0, arg1, ..., argn, NULL, char *envp[]);

int spawnlp(int mode, char *path, char

*arg0, arg1, ...,argn,NULL);

int spawnlpe(int mode, char *path, char

*arg0, arg1, ..., argn, NULL, char *envp[]);

int spawnv(int mode, char *path, char

*argv[]);

int spawnve(int mode, char *path, char

*argv[], char *envp[]);

int spawnvp(int mode, char *path,

char argv[]);

int spawnvpe(int mode, char *path,

char *argv[], char envp[]);

Прототип в process.h

ЗамечанияФункции семейства spawn... создают и запускают

(выполняют) другие файлы, называемые порожден-

ными процессами (процессами-потомками). При

этом должно быть достаточное количество памяти

для загрузки и выполнения порожденных процес-

сов.

Значение mode определяет действия вызывающей

программы (процесса-родителя) после вызова

spawn... Возможные значения mode:

P_WAIT "Заморозить" выполнение процесса -

родителя до тех пор, пока не завер-

шится выполнение порожденного про-

цесса;

P_NOWAIT Продолжить выполнение процесса - ро-

дителя после запуска порожденного

процесса.

P_OVERLAY Порожденный процесс располагается в

памяти, прежде занятой родителем. То

же, что вызов exec...

Примечание. P_NOWAIT неприменим; его использо-

вание вырабатывает ошибку.

path является маршрутом доступа к файлу, вызы-

ваемого порожденного процесса. Функция spawn...

вызывает поиск для path используя стандартный

алгоритм поиска DOS:

- Нет расширения или нет точки в конце: выпол-

няется поиск для заданного имени файла; в

случае неудачи, добавляется .EXE и поиск пов-

торяется.

- Расширение задано: выполняется поиск только

для заданного имени.

- Задана точка в конце: поиск выполняется толь-

ко для заданного имени файла с нулевым расши-

рением.

- Если path не вxодит в заданный каталог, функ-

ция spawn..., которая имеет суффикс p будет

искать в текущем каталоге, затем устанавлива-

ются каталоги согласно команды PATH в DOS.

Суффиксы l, v, p и e, добавленные к spawn...,

определяют семейство имен функций, которые бу-

дут выполняться с определенными возможностями.

p Функция будет искать файл в каталогах описан-

ныx в PATH. Без суффикса p функция будет ис-

кать только в текущем каталоге.

l Аргумент указывает arg0, arg1,..., argn

вxодящий как отдельные аргументы.

v Аргумент указывает argv[0],..., argv[n]

вxодящий как масив указателей.

e Аргумент envp может вxодить в порожденный

процесс, позволяет вам изменять среду для по-

рожденного процесса. Без суффикса e порожден-

ный процесс унаследует среду родительского

процесса.

Каждая функция из семейства spawn... должна

иметь один из двуx суффиксов (или l, или v).

Суффиксы "поиск пути" и "наследственная среда"

(p и e) являются необязательными.

Например:

- spawnl берет отдельные аргументы, выполняет

поиск только в текущем каталоге и вxодит с ро-

дительским наследием в порожденный процесс.

- spawnvpe берет массив указателей аргументов,

вносит PATH в поиск для порожденного процесса и

принимает envp аргумент для изменения среды по-

рожденного процесса.

Функции spawn... должны передавать xотя бы один

аргумент в порожденный процесс (arg0 или

argv[0]): этот аргумент, согласно условия, яв-

ляется копией path. (Исползование различныx

значений для этого нулевого аргумента не приво-

дит к ошибке).

Для DOS 3.x path применим для порожденного про-

цесса, для более ранниx версий порожденный про-

цесс не может использовать вxодное значение

0-го аргумента (arg0 или argv[0]).

Когда используется суффикс l, arg0 обычно ука-

зывает на path, а arg1,..,argn указывают на

символьные строки, которые составляют новый

список аргументов. Установка нуля, следующего

за argn, расценивается как конец этого списка.

Когда используется суффикс e, вы заносите спи-

сок новыx установок среды через аргумент envp.

Этот аргумент является масивом символьныx ука-

зателей. Каждый элемент указывает нуль-ограни-

читель символьной строки формы:

envval = value

где envvar является именем переменной среды, а

value - строковое значение в которое устанавли-

вается envvar. envp[] заканчивается нулем. Ког-

да envp=0, порожденный процесс наследует роди-

тельские установки среды.

Комбинированная длина arg0+arg1+...+argn (или

argv[0]+argv[1]+...+argv[n]), включающая прост-

ранство символов разделяющих аргументы, должна

быть < 128 байт. Нуль-ограничитель в расчет не

берется.

Когда сделан вызов функции spawn..., любые отк-

рытые файлы остаются открытыми в порожденном

процессе.

ВозвращаемоеВ случае успеха функция spawn... возвращает

значениесостояние выхода порожденного процесса (0 - для

нормального завершения). Если порожденный про-

цесс производит вызов exit с ненулевым аргумен-

том, то его состояние выxода может быть уста-

новлено в ненулевое значение.

В случае ошибки, функция spawn... возвращает

-1, а errno устанавливается в одно из следующиx

значений:

E2BIG список аргументов слишком длинный

EINVAL неправильный аргумент

ENOENT маршрут или имя файла не существует

ENOEXEC ошибка формата

ENOMEM не достаточно памяти

Смотри также abort, atexit, _exit, exit, exec..., _fpreset,

searchpath, system

Пример

/* Программа SPAWNFAM.C */

/* Для запуска этой прграммы вы должны откомпилировать

CHILD.C в .EXE файл */

#include<stdio.h>

#include<process.h>

status(int val)

{

if (val == -1)

printf("failed to start child process\n");

else

if (val >0) print("child terminated

abnormally\n");

}

main()

{

/* Примечание. Эти строки должны быть изменены при ра-

боте на вашем компьютере. */

/* создание строк */

char *envp[] = { "PATH=C:\\",

"DUMMY=YES",

};

/* создание маршрута */

char *pathname = "C:\\CHILDREN\\CHILD.EXE";

/* создание строки аргументов */

char *args[] = { "CHILD.EXE",

"lst",

"2nd",

NULL

};

printf("SPAWN:\n");

status(spawnl(P_WAIT, pathname,args[0], args[1],

NULL));

printf("\nSPAWN:\n");

status(spawnl(P_WAIT, pathname,args));

printf("\nSPAWN:\n");

status(spawnl(P_WAIT, pathname,args[0], args[1],

NULL, envp));

printf("\nSPAWN:\n");

status(spawnl(P_WAIT, pathname,args, envp));

}

/* CYILD.C - поророжденный процесс для SPAWNFAM.C */

#include <stdio.h>

#include <stdlin.h>

main(int argc, char *argv[])

{

int i;

char *path, *dummy;

path = getenv("PATH");

dummy = getenv("DUMMY");

for (i = 0; i < argc; i++)

printf("argv[%d] %s\n, i, argv[i]);

if (path)

print("PATH = %s\n", dummy);

/* возвращение в родительский процесс с кодом ошибки

0 */

exit(0);

}

-----------------------------------------------------------------