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