EXEC(2) 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 присваивается код ошибки.
|