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);
}
