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.

 Смотрите также:    abort atexit_exit exit _fpreset
                    searchpath spawn.., 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);
 }