Функция Функции, загружающие и запускающие другие программы.
Синтаксис int execl(char * pathname, char * arg0, arg1, ...,
argn, NULL);
int execle(char * pathname, char * arg0, arg1,
..., argn, NULL, char ** envp);
int execlp(char * pathname, char * arg0, arg1,
..., argn, NULL);
int execlpe(char * pathname, char * arg0, arg1,
..., argn, NULL, char ** envp);
int execv(char * pathname, char * argv[]);
int execve(char * pathname, char * argv[],
char ** envp);
int execvp(char * pathname, char * argv[]);
int execvpe(char * pathname, char * argv[],
char ** envp);
Файл, содержащий process.h
прототип
Описание Семейство функций exec... загружает и запускает
другие программы, известные как "дочерние" процес-
сы. Если вызов функции exec... завершается успеш-
но, "дочерний" процесс накладывается на "родитель-
ский" процесс; причем должно быть достаточно памя-
ти для загрузки и выполнения "дочернего" процесса.
pathname - это имя файла вызываемого "дочернего"
процесса. Функции exec... производят поиск
pathname, пользуясь стандартным алгоритмом системы
DOS:
- нет расширения имени файла и нет точки; в таком
случае производится поиск точного имени файла, ес-
ли такое имя не найдено, добавляется расширение
.com и поиск продолжается. Если и такого файла не
найдено, то добавляется расширение .exe и поиск
продолжается;
- расширение имени присутствует - производится по-
иск по точному имени файла;
- присутствует точка - производится поиск только
имени файла без расширения.
Суффиксы l, v, p и e, добавляемые к имени семейст-
ва exec... обозначают, что данная функция будет
работать с некоторыми особенностями:
p- определяет, что функция будет искать "дочернюю"
программу в директориях, определяемых переменной
среды DOS PATH. Без суффикса p поиск будет произ-
водиться только в рабочем каталоге. Если параметр
path не содержит маршрута, то поиск производится в
текущей директории, а затем по маршрутaм, опреде-
ляемым переменной окружения PATH;
l- показывает, что адресные указатели (arg0, arg1,
..., argn) передаются, как отдельные аргументы.
Обычно суффикс l употребляется, когда число пере-
даваемых аргументов заранее вам известно;
v- показывает, что адресные указатели (arg[0],
arg[1],...arg[n]) передаются, как массив указате-
лей. Обычно, суффикс v используется, когда пере-
даeтся переменное число аргументов;
e- показывает, что "дочернему" процессу может быть
передан аргумент envp, который позволяет выбирать
среду "дочернего" процесса. Без суффикса e "дочер-
ний" процесс унаследует среду "родительского" про-
цесса.
Каждая функция семейства exec... должна иметь один
из двух суффиксов, специфицирующих аргументы (либо
l, либо v). Суффиксы определения маршрута доступа
(PATH) и унаследования операционной среды (p и l)
являются необязательными.
Например:
-execl - представляет собой функцию семейства
exec..., которая передает раздельные аргументы,
ищет "дочерний" процесс только в рабочем каталоге
и передает "родительскую" среду "дочернему" про-
цессу.
-execvpe представляет собой функцию семейства
exec..., которая передает массив указателей аргу-
ментов, подсоединяет маршрут доступа PATH для по-
иска "дочернего" процесса и применяет аргумент
envp для выбора среды "дочернего" процесса.
Функция семейства exec... должна передавать "до-
чернему" процессу хотя бы один аргумент (arg0 или
argv[0]). Данный аргумент, по соглашению, предс-
тавляет собой копию pathname. (Использование дру-
гих значений для нулевого аргумента не будет ошиб-
кой).
В системах DOS версий 3.X "дочерний" процесс может
получить аргумент pathname; в более ранних версиях
"дочерний" процесс не может использовать значение
нулевого аргумента (arg0 или argn[0]).
При использовании суффикса l, арг0 обычно указыва-
ет на pathname, а arg1, ..., argn указывают на
строки символов, которые формируют новый список
аргументов. Завершающий NULL, следующий за argn,
обозначает конец списка. При использовании суффик-
са e список назначенной среды передается с помощью
аргумента envp. Данный аргумент является массивом
из элементов типа char*. Каждый элемент указывает
на символьную строку с нулевым окончанием формы:
envvar = value , где
envvar- имя переменной среды, а value- значение
символьной строки, которая присваивается каждой
переменной envvar. Последним элементом в массиве
envp[] является адресный нуль NULL. Когда значени-
ем envp[0] является NULL, "дочерний" процесс на-
следует назначения среды "родительского" процесса.
Общая длина arg0+ arg1+...+argn (или arg[0]+
arg[1]+...+arg[n]), включая пробелы, разделяющие
аргументы, должна быть меньше 128 байтов. Нулевые
окончания не считаются. При вызове функции exec...
любые открытые файлы остаются открытыми и в "до-
чернем" процессе.
Возвращаемое При успешном завершении функции exec... не возвра-
значение щают никакого значения. При возникновении ошибки
функции exec... возвращают значение -1, а глобаль-
ная переменная errno получает одно из следующих
значений:
E2BIG - Слишком длинный список аргументов;
EACCES - Отказ доступа;
EMFILE - Слишком много открытых файлов;
ENOENT - Маршрут доступа (PATH) или имя файла не
найдены;
ENOEXEC - Ошибка формата EXEC;
ENOMEM - Не хватает памяти.
Переносимость exec... уникальна для DOS.
Смотрите также: abortatexit_exitexit_fpresetsearchpathspawn.., system
Пример:
/* CHILD.C Программа для всех примеров */
#include
#include
main(int argc, char * argv[])
{
int i;
printf("Запущен дочерний процесс ...\n");
printf("%s\n",getenv("PATH"));
for (i=0; i
#include
#include
#include
int main(int argc,char *argv[])
{
int loop;
printf("%s работает...\n\n",argv[0]);
if(argc == 1) /* есть ли еще аргументы */
{
printf("%s запускает сама себя опять...\n",argv[0]);
execl(argv[0],argv[0],"ONE","TWO","THREE",NULL);
perror("EXEC:");
exit(1);
}
printf("%s вызвана с аргументами:\n",argv[0]);
for(loop = 1;loop<=argc;loop++)
puts(argv[loop]);
return 0;
}
#include
#include
#include
#include
#include
int main(int argc,char *argv[])
{
int loop;
char *new_env[] = {"TELYING",NULL};
printf("%s работает...\n\n",argv[0]);
if(argc == 1) /* есть ли еще аргументы */
{
printf("%s запускает сама себя опять...\n",argv[0]);
execle(argv[0],argv[0],"ONE","TWO","THREE",NULL,new_env);
perror("EXEC:");
exit(1);
}
printf("%s вызвана с аргументами:\n",argv[0]);
for(loop = 1;loop<=argc;loop++)
puts(argv[loop]);
/* напечатать первый параметр среды */
printf("env[0] = %s\n",env[0]);
return 0;
}
#include
#include
#include
#include
int main(int argc,char *argv[])
{
int loop;
printf("%s работает...\n\n",argv[0]);
if(argc == 1) /* есть ли еще аргументы */
{
printf("%s запускает сама себя опять...\n",argv[0]);
execlp(argv[0],argv[0],"ONE","TWO","THREE",NULL);
perror("EXEC:");
exit(1);
}
printf("%s вызвана с аргументами:\n",argv[0]);
for(loop = 1;loop<=argc;loop++)
puts(argv[loop]);
return 0;
}
#include
#include
#include
#include
#include
#include
void main(int argc,char *argv[],char **envp)
{
printf("Запуск CHILD с arg1, arg2 ...\n");
execlpe("CHILD.EXE","CHILD.EXE","arg1","arg2",NULL,envp);
perror("Ошибка EXEC");
exit(1);
}
#include
#include
#include
#include
#include
#include
void main(int argc,char **argv)
{
printf("Запуск CHILD с arg1, arg2 ...\n");
execv("CHILD.EXE",argv);
perror("Ошибка EXEC");
exit(1);
}
#include
#include
#include
#include
#include
#include
void main(int argc,char **argv,char **envp)
{
printf("Запуск CHILD с arg1, arg2 ...\n");
execve("CHILD.EXE",argv,envp);
perror("Ошибка EXEC");
exit(1);
}
#include
#include
#include
#include
#include
#include
void main(int argc,char **argv)
{
printf("Запуск CHILD с arg1, arg2 ...\n");
execvp("CHILD.EXE",argv);
perror("Ошибка EXEC");
exit(1);
}
#include
#include
#include
#include
#include
#include
int main(int argc,char **argv,char **envp)
{
printf("Запуск CHILD с arg1, arg2 ...\n");
execvpe("CHILD.EXE",argv,envp);
perror("Ошибка EXEC");
exit(1);
}