Статья: Теория вычислительных процессов и структур

{

printf (“Запуск программы ls\n”);

execl (“/bin/ls”, “ls”, “-l”, (char*)0);

/* Если execl возвращает значение, то вызов был неудачным*/

perror(“Вызов execl не смог запустить программу ls”);

exit(1);

}

Работа этой программы показана на рис. 2.3.


Рис. 2.3. Вызов exec

Другие формы вызова exec упрощают задание списков параметров запуска загружаемой программы. Вызов execv принимает два аргумента: первый является строкой, которая содержит полное имя и путь к запускаемой программе. Второй аргумент является массивом строк. Первый элемент этого массива указывает на имя запускаемой программы (исключая префикс пути). Оставшиеся элементы указывают на все остальные аргументы программы. Следующий пример использует вызов execv для запуска той же программы ls, что и в предыдущем примере:

include <unistd.h>

main()

{

char * const av[]={“ls”, “-l”, (char *)0};

execv(“/bin/ls”, av);

/* Если мы оказались здесь, то произошла ошибка*/

perror(“execv failed”);

exit(1);

}

Функции execlp и execvp почти эквивалентны функциям execl и execv. Основное отличие – первый аргумент есть просто имя программы, а не полный путь к ней.

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

include <unistd.h>

main()

{

pid_t pid;

switch (pid = fork()) {

case -1:

fatal(“Ошибка вызова fork”);

break;

К-во Просмотров: 575
Бесплатно скачать Статья: Теория вычислительных процессов и структур