CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник по функциям C/C++
execl, execle, execlp, execv, execve, execvp, execvpe
execl, execle, execlp, execv, execve, execvp, execvpe
Функция Функции, загружающие и запускающие другие программы. Синтаксис 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 и e) являются необязательными. Например: - 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. Смотрите также: abort, atexit,_exit, exit, _fpreset, searchpath, spawn..., system. Пример: #include <stdio.h> #include <stdlib.h> main(int argc, char * argv[]) { int i; printf("Запущен дочерний процесс ...\n"); printf("%s\n",getenv("PATH")); for (i=0; i<argc; i++) printf("argv[%d]: %s\n", 1, argv[i]); } #include<stdio.h> #include<errno.h> #include<dos.h> 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<process.h> #include<stdlib.h> #include<stdio.h> #include<errno.h> #include<dos.h> 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<process.h> #include<stdio.h> #include<errno.h> #include<dos.h> 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<process.h> #include<stdio.h> #include<errno.h> #include<stdlib.h> #include<string.h> #include<dos.h> 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<process.h> #include<stdio.h> #include<errno.h> #include<stdlib.h> #include<string.h> #include<dos.h> void main(int argc,char **argv) { printf("Запуск CHILD с arg1, arg2 ...\n"); execv("CHILD.EXE",argv); perror("Ошибка EXEC"); exit(1); } #include<process.h> #include<stdio.h> #include<errno.h> #include<stdlib.h> #include<string.h> #include<dos.h> void main(int argc,char **argv,char **envp) { printf("Запуск CHILD с arg1, arg2 ...\n"); execve("CHILD.EXE",argv,envp); perror("Ошибка EXEC"); exit(1); } #include<process.h> #include<stdio.h> #include<errno.h> #include<stdlib.h> #include<string.h> #include<dos.h> void main(int argc,char **argv) { printf("Запуск CHILD с arg1, arg2 ...\n"); execvp("CHILD.EXE",argv); perror("Ошибка EXEC"); exit(1); } #include<process.h> #include<stdio.h> #include<errno.h> #include<stdlib.h> #include<string.h> #include<dos.h> int main(int argc,char **argv,char **envp) { printf("Запуск CHILD с arg1, arg2 ...\n"); execvpe("CHILD.EXE",argv,envp); perror("Ошибка EXEC"); exit(1); }