Переключение процесса на выполнение другой программы

Семейство функций exec содержит набор функций, которые переключают процесс на выполнение другой программы, т.е. изменяют образ процесса. При этом прекращается выполнение текущей программы и начинается выполнение в этом же процессе другой программы, начиная с ее точки входа. Функции семейства exec различаются набором аргументов:

· Функции, которые содержат в имени букву p (execvp и execlp), принимают имя программы и ищут программу по имени во всех путях, содержащихся в PATH; в функции, не содержащие в имени букву p, должно быть передано полное имя пути программы.

· Функции, которые содержат в имени букву v (execv, execvp и execve), принимают список параметров для новой программы как массив указателей на строки с последним нулевым элементом. Каждая строка соответствует одному параметру. В функции, содержащие в имени букву l (execl, execlp, execle), параметры передаются как параметры соответствующей функции exec.

· Функции, которые содержат в имени букву e (execve и execle), принимают дополнительный параметр - массив переменных окружения. Этот параметр должен быть массивом указателей на строки, с последним нулевым элементом. Каждая строка должна иметь вид "ПЕРЕМЕННАЯ=значение".

Т.к. exec заменяет вызывающую программу на другую, то exec никогда не возвращает управление в вызывающую программу в случае успеха. Таким образом, код, находящийся после exec, будет выполнен только в случае ошибки в вызове exec.

Список параметров, передаваемых в вызываемую программу, является аналогом параметров командной строки. Первым параметром (*argv[0]) в нем должно быть имя программы.

Один из вариантов запуска новых программ - в основной программе создать дочерний процесс (fork) и в нем переключиться на другую программу (exec), как в задании 5:

Задание 5.

5.1. Выполните программу pr5.c, которая в дочернем процессе вызывает программу ls с теми же параметрами, что и в задании 3. Определите, какой оператор(ы) никогда не выполняется в случае успешного выполнения exec.

/* pr5.c */

#include <stdio.h>

#include <unistd.h>

int main()

{

char* arg_list[] = {"ls", "-l", "/", NULL};

if (fork() == 0)

{

execvp("ls", arg_list);

printf("Return after execn");

}

return 0;

}

 

5.2. Модифицируйте программу: замените execvp на execlp:

execlp("ls", "ls", "-l", "/", NULL);

5.3. Сделайте ошибку в вызове exec: а) укажите вместо "ls" имя несуществующей программы; б) задайте несуществующий каталог для ls. Различаются ли при выполнении случаи а) и б) ?

5.4. Модифицируйте программу: загрузите в дочерний процесс (используйте execl) любую вашу программу (например, печатающую "Hello, world" из лабораторной работы 2.