[<<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 установлена