Описание функций Си

       

Execl



     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 и 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.

Смотрите также: ..,

Пример:

/* 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

#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



#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

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


Содержание раздела