Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:
реклама
Расскажем как взять займ без отказа даже с плохой кредитной историей

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог