Функция exec() (execute) загружает и запускает другую программу.
Таким образом, новая программа полностью замещает текущий процесс.
Новая программа начинает свое выполнение с функции main.
Все файлы, открытые вызывающей программой, остаются открытыми. Они
также являются доступными новой программе. Существуют следующие 6
различных вариантов функций exec.
#include <unistd.h>
int execl(char *name, char *arg0, ... /*NULL*/);
int execv(char *name, char *argv[]);
int execle(char *name, char *arg0, ... /*,NULL, char *envp[]*/);
int execve(char *name, char *arv[], char *envp[]);
int execlp(char *name, char *arg0, ... /*NULL*/);
int execvp(char *name, char *argv[]);
Вызов exec происходит таким образом, что переданная в качестве
аргумента программа загружается в память вместо старой программы,
которая вызывает exec. Старой программе больше не доступны
сегменты памяти, которые перезаписаны новой программой.
Буквы l, v, p и e в конце имен функций определяют
формат и объем аргументов, а также каталоги, в которых нужно искать
загружаемую программу.
l (список)
Аргументы командной строки передаются в форме списка arg0, arg1....
argn, NULL. Эту форму используют, если количество аргументов известно.
v (vector)
Аргументы командной строки передаются в форме вектора argv [].
Отдельные аргументы адресуются через argv [0], argv [1]...
argv [n]. Последний аргумент (argv [n]) должен быть указателем
NULL.
p (path)
Указанный по имени файл ищется не только в текущем каталоге, но и
в каталогах, определенных переменной среды PATH.
e (среда)
Функция ожидает список среды в виде вектора (envp []) и не использует
текущую среду.
Начнем с примера для execl(). Пусть существует следующая
программа (рис. 3):
#include <stdio.h>
int main(int argc, char *argv[])
{
int i=0;
printf("%s\n",argv[0]);
printf("Программа запущена и получила строку : ");
while(argv[++i] != NULL)
printf("%s ",argv[i]);
return 0;
}
Рис. 3. Программа, вызываемая через exec().
Эта программа выводит на экран строку, переданную ей в качестве аргумента.
Пусть она называется hello. Она будет вызвана из другой программы
с помощью функции execl(). Код вызывающей программы ниже
(рис. 4.):
#include <stdio.h>
#include <unistd.h>
int main(int argc, int *argv[])
{
printf("Будет выполнена программа %s...\n\n", argv[0]);
printf("Выполняется %s", argv[0]);
execl("hello","","Hello", "World!", NULL);
return 0;
}
Рис. 4. Программа вызова exec().
В строке execl() указаны аргументы в виде списка. Доступ
к ним также осуществляется последовательно. Если использовать функцию
execv(), то вместо списка будет указан вектор аргументов
(рис. 5):
#include <stdio.h>
#include <unistd.h>
int main(int argc, int *argv[])
{
printf("Программа %s будет выполнена...\n\n", argv[0]);