next up previous contents
Next: Сигналы Up: Процессы Previous: Создание процессов с помощью   Contents

Запуск процессов с помощью вызова exec().

Функция 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 в конце имен функций определяют формат и объем аргументов, а также каталоги, в которых нужно искать загружаемую программу.

Начнем с примера для 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]);

  printf("Выполняется %s", argv[0]);

  execv("hello",argv);

  return 0;

}

Рис. 4. Программа вызова execv().



2003-12-09