[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Исполнение программы

Процесс может заменить текущую программу на новую, исполнив системный
вызов exec(2). Этот вызов заменяет текст, данные и стек текущей
программы на соответствующие сегменты новой программы. Однако
пользовательская область при этом вызове сохраняется.
Существует шесть вариантов системного вызова exec(2). Обратите
внимание, что за exec идет одна или несколько букв: l (список
аргументов), v (вектор аргументов), e (изменение среды) или p
(использование переменной PATH). Формат вызова exec(2) определяет,
какие данные передаются новой программе. Ниже приведены параметры
различных версий exec(2):
  path         указывает на  строку, которая  содержит абсолютное  или
               относительное имя загрузочного модуля в формате a.out.
  file         указывает на  строку, содержащую имя загружаемого файла
               в  формате   a.out,  который   находится  в   одной  из
               директорий, перечисленных в переменной PATH.
  arg0,...,argn указывают  на строки  - значения  параметров,  которые
               надо передать  новой программе. Эти значения помещаются
               в  вектор   argv[]  -  параметр  функции  main()  новой
               программы. Количество  параметров помещается в параметр
               argc   функции   main().   Список   параметров   должен
               завершаться нулем.
  argv[]       вектор  указателей  на  строки,  содержащие  параметры,
               которые нужно  передать новой  программе.  Преимущество
               использования argv состоит в том, что список параметров
               может  быть  построен  динамически.  Последний  элемент
               вектора должен содержать нулевой адрес.
  envp[]       вектор  указателей   на  строки,  представляющие  новые
               переменные  среды   для   новой   программы.   Значения
               элементов этого  массива копируются  в параметр  envp[]
               функции main()  новой  программы.  Аналогично,  environ
               новой программы  указывает на  envp[0] новой программы.
               Последний  элемент   envp[]  должен  содержать  нулевой
               адрес.
  cnup         указатель   на    вектор    указателей    на    строки,
               представляющие новые переменные среды новой программы.

arg0 или argv[0], как, правило устанавливается равным последней
компоненте path или параметру file.
Если exec(2) исполняется успешно, то новая программа не возвращает
управление в исходную (ее просто не существует). Ваша программа должна
сама проверять факт возврата из exec(2). Если он возвратил управление,
значит вызов завершился неудачей. Например, exec(2) будет неудачным,
если требуемая программа не найдена.
Любой файл, открытый перед вызовом exec(2), остается открытым, если
при помощи fcntl(2) для его дескриптора не был установлен флаг
закрыть-по-exec. Это обсуждалось в разделе, посвященном системным
вызовам ввода/вывода.
Для версий exec(2), не изменяющих среду исполнения, в качестве новой
среды передается массив указателей, на который указывает внешняя
переменная environ.
                         ИСПОЛНЕНИЕ ПРОГРАММЫ
exec(2)

ИМЯ

      execl, execv, execle, execve, execlp, execvp - исполнить файл

ИСПОЛЬЗОВАНИЕ

      #include <unistd.h>

      int execl (const char *path, const char *arg0,
            ..., const char *argn, (char *) 0);

      int execv (const char *path, char *const *argv);
      int execle (const char *path, const char *arg0,
            ..., const char *argn,
              (char *) 0, const char *envp[ ]);

      int execve (const char *path, char *const *argv,
             char *const *cnup);

      int execlp (const char *file, const char *arg0,
             ..., const char *argn, (char *) 0);

      int execvp (const char *file, char *const *argv);

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

      успех    - не возвращает управление

      неуспех  - -1 и errno установлена