EXEC(2)

НАЗВАНИЕ
exec: execl, execv, execle, execve, execlp, execvp выполнение файла

СИНТАКСИС


        int execl (path, arg0, arg1, ..., argn, (char*) 0)

        char *path, *arg0, *arg1, ..., *argn;



        int execv (path, argv)

        char *path, *argv [];



        int execle (path, arg0, arg1, ..., argn, (char*) 0, envp)

        char *path, *arg0, *arg1, ..., *argn, *envp [];



        int execve (path, argv, envp)

        char *path, *argv [], *envp [];



        int execlp (file, arg0, arg1, ..., argn, (char*) 0)

        char *file, *arg0, *arg1, ..., *argn;



        int execvp (file, argv)

        char *file, *argv [];

ОПИСАНИЕ
Все формы системного вызова exec превращают вызвавший процесс в новый процесс, который строится из обычного выполняемого файла, называемого в дальнейшем новым выполняемым файлом. Выполняемый файл состоит из заголовка [см. a.out(4)], сегмента команд (.text) и данных. Данные состоят из инициализированной (.data) и неинициализированной (.bss) частей. Если системный вызов exec закончился успешно, то он не может вернуть управление, так как вызвавший процесс уже заменен новым процессом.

При запуске C-программы ее вызывают следующим образом:


     main (argc, argv, envp)

     int argc;

     char **argv, **envp;

где argc равен количеству аргументов, argv - массив указателей собственно на аргументы и envp - массив указателей на цепочки символов, образующие окружение. Принято соглашение, по которому значение argc не меньше 1, а первый элемент массива argv указывает на цепочку символов, содержащую имя нового выполняемого файла.

Аргументам системных вызовов группы exec приписан следующий смысл.

Аргумент path указывает на маршрутное имя нового выполняемого файла.

Как и path, аргумент file указывает новый выполняемый файл, но маршрут этого файла определяется в результате просмотра каталогов, переданных через переменную окружения PATH [см. environ(5)]. Окружение поддерживается shell'ом [см. sh(1)].

Аргументы arg0, arg1, ..., argn - это указатели на цепочки символов, ограниченные нулевыми байтами. Эти цепочки образуют доступный новому процессу список аргументов. По соглашению, как минимум arg0 должен присутствовать и указывать на цепочку символов, равную path (или последнему компоненту path).

Массив argv содержит указатели на цепочки символов, ограниченные нулевыми байтами. Эти цепочки образуют доступный новому процессу список аргументов. По соглашению, в argv должен присутствовать как минимум первый элемент, указывающий на цепочку символов, равную path (или последнему компоненту path). За последним занятым элементом массива argv должен следовать пустой (нулевой) указатель.

Массив envp содержит указатели на цепочки символов, ограниченные нулевыми байтами. Эти цепочки образуют окружение нового процесса. За последним занятым элементом массива envp должен следовать пустой указатель.

Перед началом выполнения любой программы во внешнюю переменную environ, описание которой выглядит как


     extern char **environ;

помещается адрес массива указателей на цепочки символов, образующие окружение процесса. С помощью этой переменной (как и с помощью аргумента envp функции main) в новом процессе всегда можно получить доступ к окружению, независимо от использовавшегося варианта системного вызова exec. Разница лишь в том, что в случае вызовов execle и execve окружение нового процесса задается явно, а в остальных случаях наследуется у вызвавшего процесса.

Файлы, открытые в вызвавшем процессе, остаются открытыми в новом процессе, за исключением тех, у которых установлен флаг "закрыть при выполнении вызова exec" [см. fcntl(2)]. Если файл остался открытым, то указатель текущей позиции в файле сохраняется.

Реакция на сигналы сохраняется, за исключением того, что сигналы, которые перехватывались в вызвавшем процессе, вызывают терминирование нового процесса [см. signal(2)].

В случае, когда реакция на сигналы устанавливалась вызовом sigset(2) и задавалась как SIG_DFL, SIG_IGN или SIG_HOLD, эта реакция наследуется у вызвавшего процесса. Однако, если сигнал перехватывался, то устанавливается реакция SIG_DFL и все полученные, но не обработанные сигналы этого типа откладываются.

Если у нового выполняемого файла установлен бит разрешения переустанавливать действующий идентификатор пользователя

[см. chmod(2)], то действующий идентификатор пользователя нового процесса устанавливается равным идентификатору владельца нового выполняемого файла. Аналогично, если у нового выполняемого файла установлен бит разрешения переустанавливать действующий идентификатор группы, то действующий идентификатор группы нового процесса устанавливается равным идентификатору группы нового выполняемого файла. Реальный идентификатор пользователя и реальный идентификатор группы нового процесса наследуются у вызвавшего процесса.

Присоединенные разделяемые сегменты памяти не наследуются новым процессом [см. shmop(2)].

У нового процесса выключено профилирование.

Кроме того, новый процесс наследует у процесса, вызвавшего exec, следующие характеристики:

  1. Значение поправки к приоритету [см. nice(2)].
  2. Идентификатор процесса.
  3. Идентификатор родительского процесса.
  4. Идентификатор группы процессов.
  5. semadj значения [см. semop(2)].
  6. Идентификатор группы терминала [см. exit(2)].
  7. Режим трассировки [см. ptrace(2)].
  8. Время, оставшееся до срабатывания будильника [см. alarm(2)].
  9. Текущий рабочий каталог.
  10. Корневой каталог.
  11. Маска режима создания файлов [см. umask(2)].
  12. Ограничение на размер файла [см. ulimit(2)].
  13. Счетчики времени, потраченного для обслуживания этого процесса (tms_utime, tms_stime, tms_cutime, tms_cstime) [см. times(2)].
  14. Блокировки доступа к сегментам файлов
    [см. fcntl(2) и lockf(3C)].

Системный вызов exec завершается неудачей и управление возвращается, если выполнено хотя бы одно из следующих условий:

[ENOENT]
Компонент маршрута нового выполняемого файла не существует.
[ENOTDIR]
Компонент маршрута нового выполняемого файла не является каталогом.
[EACCES]
Один из каталогов, перечисленных в маршруте нового выполняемого файла, не доступен для просмотра.
[EACCES]
Новый выполняемый файл не является обычным файлом.
[EACCES]
Нет прав на выполнение нового файла.
[ENOEXEC]
Права на выполнение нового файла есть, но его заголовок не начинается с допустимого магического числа [см. a.out(4)].
[ETXTBSY]
Новый выполняемый файл в настоящий момент открыт для записи некоторым процессом.
[ENOMEM]
Новый процесс требует больше памяти, чем позволяет системное ограничение MAXMEM.
[E2BIG]
Суммарная длина списка аргументов превышает системное ограничение, равное 5120 байт.
[EFAULT]
Отсутствует требуемое оборудование.
[EFAULT]
Некорректные адреса в качестве аргументов.
[EAGAIN]
Не хватает памяти.
[ELIBACC]
К требуемой разделяемой библиотеке не разрешен доступ на выполнение.
[ELIBEXEC]
Попытка непосредственно выполнить разделяемую библиотеку.
[EINTR]
Во время выполнения вызова exec перехвачен сигнал.
[ENOLINK]
Аргумент path указывает на удаленный компьютер, связи с которым в данный момент нет.
[EMULTIHOP] Компоненты path требуют многократного обращения к удаленным компьютерам.

СМ. ТАКЖЕ
alarm(2), exit(2), fcntl(2), fork(2), nice(2), ptrace(2), semop(2), shmop(2), signal(2), sigset(2), times(2), ulimit(2), umask(2), lockf(3C), a.out(4), environ(5).
sh(1) в Справочнике пользователя.

ДИАГНОСТИКА
Возврат из системного вызова exec свидетельствует об ошибке. В таком случае результат равен -1, а переменной errno присваивается код ошибки.