Выполнить файл
#include <process.h>int execve( const char *path,char * const argv[],char * const envp[] );
NULL
. Необходимо, чтобы этот массив был завершен указателем на NULL
. Эти строки составляют список аргументов, доступных для образа нового процесса. Аргумент arg0 должен указывать на имя файла, связанного с запускаемым процессом.NULL
-терминированные строки. Эти строки представляют собой окружение для образа нового процесса. Массив envp завершается указателем на NULL
.libc
Функция execve() заменяет образ текущего процесса на образ нового процесса, определенного в path. Новый образ создается из обычного исполняемого файла, называемого файлом образа нового процесса. Возврата не происходит, поскольку образ вызывающего процесса заменяется образом нового процесса.
Когда программа на языке C запускается в результате этого вызова, она вызывается как функция C следующим образом:
int main( int argc, char *argv[] );
где argc - количество аргументов, а argv - массив символьных указателей на аргументы. Кроме того, следующая переменная:
extern char **environ;
инициализируется как указатель на массив символьных указателей на переменные окружения. Массивы argv и environ завершаются указателями на NULL
. Указатель на NULL
, завершающий массив argv, не входит в количество argc.
Многопоточные приложения не должны использовать переменную environ для доступа или модификации какой-либо переменной окружения в то же время, как любой другой поток изменяет любую переменную среды. Вызов любой функции, зависящей от любой переменной окружения, считается использованием переменной environ для доступа к переменной окружения.
Аргументы, указанные программе в одной из функций exec*(), передаются образу нового процесса как соответствующие аргументы main().
Количество байт, доступное для объединенного списка аргументов и переменных среды нового процесса, определяется ARG_MAX
.
Файловые дескрипторы, открытые в образе вызывающего процесса, остаются открытыми в образе нового процесса кроме тех, для которых установлен флаг fcntl() FD_CLOEXEC. Для тех файловых дескрипторов, которые остаются открытыми, все атрибуты открытого файлового дескриптора, включая файловые блокировки, остаются неизменными. Если файловый дескриптор закрывается, файловые блокировки, описанные в close(), удаляются, с другой стороны, блокировки, не зависящие от close(), остаются неизменными.
Потоки каталогов, открытые в образе вызывающего процесса, закрываются в образе нового процесса.
Сигналы, установленные в SIG_DFL
в вызывающем процессе, устанавливаются на действие по умолчанию для образа нового процесса. Сигналы, установленные в SIG_IGN
в образе вызывающего процесса, игнорируются в образе нового процесса. Сигналы, которые должны быть перехвачены в образе вызывающего процесса, устанавливаются на действие по умолчанию для образа нового процесса. После успешного вызова стеки альтернативных сигналов не сохраняются, флаг SA_ONSTACK
очищается для всех сигналов.
После успешного вызова любые функции, зарегистрированные atexit(), перестают быть зарегистрированными.
Если path находится на файловой системе, смонтированной с установленным флагом ST_NOSUID, эффективный идентификатор пользователя, эффективный идентификатор группы, сохраненный идентификатор пользователя и сохраненный идентификатор группы остаются неизменными для нового процесса. В ином случае, если установлен бит режима идентификатора пользователя, эффективный идентификатор пользователя образа нового процесса устанавливается в идентификатор пользователя path. Аналогично, если установлен бит режима идентификатора группы, эффективный идентификатор группы устанавливается в идентификатор группы path. Идентификатор фактического пользователя, идентификатор фактической группы и идентификаторы дополнительных групп нового процесса остаются такими же, как и у вызывающего процесса. Эффективный идентификатор пользователя и эффективный идентификатор группы образа нового процесса сохраняются (как сохраненный идентификатор пользователя и сохраненный идентификатор группы, используемые setuid()).
Любые сегменты разделяемой памяти, присоединенной к образу вызывающего процесса, не присоединяются к образу нового процесса. Если вызывающий процесс заблокировал некоторый сегмент памяти, блокировки снимаются.
Новый процесс наследует как минимум следующие атрибуты образа вызывающего процесса:
При вызове функции из процесса с более чем одним потоком все потоки завершаются, а новый исполняемый образ загружается и выполняется. Функции завершения не вызываются.
После успешного завершения поле st_atime файла помечается для обновления. Если функция exec* завершилась неудачно, но смогла найти файл образа процесса, не определено, будет ли поле st_atime помечено для обновления. В случае успеха файл образа процесса считается открытым с помощью open(). Соответствующий вызов close() считается происходящим сразу после этого открытия, но до завершения процесса или успешного завершения последующего вызова функции семейства exec*.
Коротко об exec*()
Функция | Описание | POSIX-совместимая? |
---|---|---|
execl() | Список аргументов, завершаемый NULL | Да |
execle() | Список аргументов, завершаемый NULL , определение окружения нового процесса | Да |
execlp() | Список аргументов, завершаемый NULL , поиск нового процесса проходит в PATH | Да |
execlpe() | Список аргументов, завершаемый NULL , определение окружения нового процесса, поиск нового процесса проходит в PATH | Нет |
execv() | Список аргументов, завершаемый NULL | Да |
execve() | Список аргументов, завершаемый NULL , определение окружения нового процесса | Да |
execvp() | Список аргументов, завершаемый NULL , поиск нового процесса проходит в PATH | Да |
execvpe() | Список аргументов, завершаемый NULL , определение окружения нового процесса, поиск нового процесса проходит в PATH | Нет |
При успешном завершении функция не возвращает управление; если возникла ошибка, функция возвращает -1
, код ошибки записывается в errno.
ARG_MAX
байт. PATH
превышает PATH_MAX
. POSIX 1003.1
abort(), atexit(), close(), errno, execl(), execle(), execlp(), execlpe(), execv(), execvp(), execvpe(), _exit(), exit(), getenv(), main(), putenv(), spawn(), spawnl(), spawnle(), spawnlp(), spawnlpe(), spawnp(), spawnv(), spawnve(), spawnvp(), spawnvpe(), system()
Предыдущий раздел: Описание API системной библиотеки