Функция Создает и запускает дочерний процесс.
Синтаксис #include
#include
int spawnl(int mode, char *pathname, char *arg0,
arg1,...,argn, NULL);
int spawnle(int mode, char *pathname, char *arg0,
arg1,...,argn, NULL);
int spawnlp(int mode, char *pathname, char *arg0,
arg1,...,argn, NULL);
int spawnlpe(int mode, char *pathname, char *arg0,
arg1,...,NULL, char *envp[]);
int spawnv(int mode, char *pathname, char*argv[]);
int spawnve(int mode, char *pathname,
char *argv[], char *envp[]);
int spawnvp(int mode, char *pathname,
char *argv[]);
int spawnvpe(int mode, char *pathname,
char *argv[], char * envp[]);
Файл, содержащий process.h
прототип
Описание Функции семейства spawn... создают и запускают
другие программные файлы, известные под названием
"дочерний процесс". Для загрузки и выполнения до-
чернего процесса должно быть достаточно памяти.
Значение параметра mode влияет на то, каким обра-
зом материнский процесс продолжит свои действия
после вызова функции spawn... . Далее перечислены
возможные значения аргумента mode:
P_WAIT Ставит родительский процесс в состояние
ожидания до тех пор, пока дочерний процесс
не завершится.
P_NOWAIT Продолжает работу родительского процесса
одновременно с работой дочернего процес-
са.
P_OVERLAY Перекрывает дочерним процессом область
памяти первоначально занятую родитель-
ким процессом. Работает аналогично вы-
зову функции exec... .
Примечание. Значение P_NOWAIT в данной версии не
поддерживается; использование его приведет к
ошибке.
Аргумент pathname представляет собой имя файла
дочернего процесса. Функции семейства spawn...
осуществляют поиск файла с данным именем, пользу-
ясь следующим стандартным алгоритмом DOS:
- Нет расширения или нет точки; осуществляется
поиск по точному имени файла, если по такому
имени файл не найден, добавляется .COM, и поиск
производится снова, если опять не найден, то
добавляет .EXE и поиск повторяется;
- Расширение имени присутствует; поиск произво-
дится только по точному имени файла;
- Точка присутствует; поиск производится только
по имени файла - без расширения.
- Если path не содержит имени директории, то фун-
кции spawn... с суффиксом p производят поиск в
текущей директории, а затем в директориях, ука-
занных в переменной окружения PATH.
Суффиксы, добавляемые к имени функции spawn...
(l, v, p, e) отражают некоторые особенности рабо-
ты функций:
p - означает, что функция будет искать дочерний
процесс в директориях, определяемых перемен-
ной операционной среды системы DOS-PATH. Без
задания суффикса p функция будет искать файл
только в текущей рабочей директории.
l - означает, что аргументы-указатели arg0, arg1,
... argn передаются, как отдельные аргументы.
Обычно, суффикс l применяется, когда количес-
тво передаваемых аргументов известно заранее.
v - означает, что аргументы-указатели передаются
в виде массива указателей: argv[0],
...argv[n]. Обычно суффикс v употребляется
при переменном числе аргументов.
e - обозначает, что дочернему процессу может быть
передан аргумент envp, что позволяет менять
операционную среду дочернего процесса. Без
суффикса e дочерний процесс наследует опера-
ционную среду родительского процесса.
Каждая функция семейства spawn... должна иметь
один из двух суффиксов l или v. Суффиксы p и e
необязательны.
Например:
- функция с именем spawnl - это функция семейства
spawn..., принимающая отдельные аргументы, осу-
ществляющая поиск файла дочернего процесса в
корневой или рабочей директории и передающей
дочернему процессу операционную среду родитель-
ского процесса.
- Функция spawnvpe - это функция семейства
spawn..., которая принимает массив аргумен-
тов-указателей, применяет параметр среды PATH
для поиска файла дочернего процесса и передает
ему параметр envp, позволяющий ему изменить
свою операционную среду.
Функции семейства spawn... должны передавать до-
чернему процессу по крайней мере один аргумент
(arg0 или argv[0]). По соглашению данным аргумен-
том является копия параметра pathname. (Использо-
вание для данного нулевого аргумента других зна-
чений не вызовет ошибку).
В версиях операционной системы DOS 3.0 и выше
поддерживается аргумент pathname. В более ранних
версиях не может использоваться значение нулевого
аргумента (arg0 или argv[0]).
При использовании суффикса l arg0 обычно адресует
pathname, а остальные аргументы arg1,...,argn яв-
ляется указателями на символьные строки, реально
составляющие список аргументов. Обязательный ад-
ресный нуль NULL завершает список аргументов.
При использовании суффикса e, список новых назна-
чений операционной среды передается посредством
аргумента envp. Данный аргумент представляет со-
бой массив указателей, где каждый элемент указы-
вает на символьную строку с нулевым окончанием в
форме:
envvar = value,
где envvar - это имя переменной операционной сре-
ды, а value - это строковое, значение, присваива-
емое переменной envvar. Последним элементом мас-
сива envp[] является NULL. Когда envp[0] равно
NULL, дочерний процесс наследует назначения среды
родительского процесса.
Общая длина списка arg0+arg1+...+argn (или
argv[0]+argv[1]+...+argv[n]), включая пробелы,
разделяющие аргументы, должна быть <128 байт,
причем нулевые окончания не учитываются.
После вызова функции spawn... любые открытые ра-
нее файлы остаются открытыми в дочернем процессе.
Возвращаемое При успешном завершении возвращается статус выхода
значение из дочернего процесса (0- для нормального выхода).
Если дочерний процесс специально вызывал функцию
exit с ненулевым аргументом, его выходной статус
также получит ненулевое значение.
В случае ошибки функции spawn... возвращают -1, и
переменная errno получает одно из следующих зна-
чений:
E2BIG - Список аргументов слишком длинный;
EINVAL - Неверный аргумент:
ENOENT - Маршрут или имя файла не найдены;
ENOEXEC - Ошибка формата EXEC:
ENOMEM - Не хватает памяти.
Переносимость Функции семейства spawn... уникальны для DOS.
Смотрите также abortatexit_exitexitexec.., _fpresetsearchpathsystem
Пример 1:
#include
#include
#include
int main(void)
{
int result;
clrscr();
result = spawnl(P_WAIT,"tcc.exe",NULL);
if(result==-1)
{
perror("Ошибка spawnl");
exit(1);
}
return 0;
}
Пример 2:
#include
#include
#include
int main(void)
{
int result;
clrscr();
result = spawnle(P_WAIT,"tcc.exe",NULL,NULL);
if(result==-1)
{
perror("Ошибка spawnle");
exit(1);
}
return 0;
}