Программирование на C и C++

Онлайн справочник программиста на C и C++

spawnl, spawnle, spawnlp, spawnlpe, spawnv, spawnve, spawnvp, spawnvpe

int spawnl(int mode, char *fname, char *arg0, ..., char *argN, NULL)

int spawnle(int mode, char *fname, char *arg0, ..., char *argN, NULL, char *envp[ ])

int spawnlp(int mode, char *fname, char *arg0, ..., char *argN, NULL)

int spawnlpe(int mode, char *fname, char *arg0, ..., char *argN, NULL, char *envp[ ])

int spawnv(int mode, char *fname, char *arg[ ])

int spawnve(int mode, char *fname, char *arg[ ], char *envp[ ])

int spawnvp(int mode, char *fname, char *arg[ ])

int spawnvpe(int mode, char *fname, char *arg[ ], char *envp[ ])

Прототип: 
Описание: 

Эти функции не определены стандартом ANSI C.

Группа функций spawn используется для исполнения другой программы. Эта другая програм­ма-потомок не обязательно замещает программу-предок (в противоположность тому, что проис­ходит при вызове группы функций exec). Имя файла, содержащего процесс-потомок, задается с помощью параметра fname. Если процесс-потомок имеет аргументы, то они передаются либо индивидуально параметрами arg0 ... argN, либо с помощью массива arg[]. Для передачи строки окружения на нее должен указывать envp[]. (На аргументы будет указывать argv в процессе-потомке.) Параметр mode задает, каким образом будет исполняться процесс-потомок. Его величина задается следующими макросами, определенными в файле process.h:

МакросРежим исполнения
P_WAITПриостановить процесс-предок до тех пор, пока не будет завершен процесс-потомок.
P_NOWAITИсполнять оба процесса в текущем режиме. Идентификатор процесса-потом­ка возвращается процессу-предку.
P_NOWAITOТо же самое, что и P_NOWAIT, за исключением того, что идентификатор процесса-потомка не возвращается процессу-предку.
P_DETACHТо же самое, что и P_NOWAITO, за исключением того, что процесс-потомок исполняется как фоновый процесс.
P_OVERLAYЗамещает процесс-предок в памяти.

При использовании опции P_WAIT по окончании процесса-потомка, процесс-предок продол­жает исполнение со строки кода после вызова функции spawn.

Если строка, на которую указывает fname, не содержит ни расширения, ни точки, то поиск осуществляется по имени файла. Если при этом файл не найден, добавляется расширение ЕХЕ и поиск повторяется. Если и в этом случае файл оказывается не найденным, то используется расши­рение СОМ и поиск повторяется. При неудаче используется расширение ВАТ и поиск опять по­вторяется. Если же расширение задано, то поиск осуществляется на предмет точного совпадения. Если имеется точка, но расширение не указано, то осуществляется поиск файла только по левой части имени файла.

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

Функции, содержащие в качестве суффикса р, ищут процесс-потомок в каталогах, указанных в команде PATH. Если суффикс р не задан, то поиск ведется только в текущем каталоге.

При использовании суффикса l аргументы передаются процессу-потомку индивидуально. Этот метод используется при наличии фиксированного числа аргументов. Следует обратить внимание, что последний аргумент должен быть NULL. (NULL определен в файле stdio.h.)

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

Суффикс е указывает, что одна или более строк окружения будут переданы процессу-потомку. Параметр envp[] является массивом указателей на строки. Каждая строка, на которую указывает данный массив, должна иметь следующую форму: переменная_окружения = значение

Последний указатель в массиве должен быть NULL. Если первым элементом массива является NULL, то процесс-потомок сохраняет то же самое окружение, что и процесс-предок.

Важно помнить, что файлы, открытые при вызове spawn, открыты также в процессе-потомке.

При успешном вызове функции spawn возвращают 0. При неудаче возвращается значение —1, а переменная errno устанавливается равной одному их следующих значений:

МакросЗначение
EINVALНеверный аргумент
E2BIGСлишком много аргументов
ENOENTФайл не найден
ENOEXECНедействительный формат spawn
ENOMEMНедостаточно свободной памяти для загрузки процесса-потомка

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

Пример: