НАЗВАНИЕ
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 и все полученные, но не обработанные сигналы этого типа откладываются.
Если у нового выполняемого файла установлен бит разрешения переустанавливать действующий идентификатор пользователя
Присоединенные разделяемые сегменты памяти не наследуются новым процессом [см. shmop(2)].
У нового процесса выключено профилирование.
Кроме того, новый процесс наследует у процесса, вызвавшего exec, следующие характеристики:
Системный вызов exec завершается неудачей и управление возвращается, если выполнено хотя бы одно из следующих условий:
СМ. ТАКЖЕ
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 присваивается код ошибки.