execv()

Выполнить файл

Прототип:

#include <process.h>
int execv( const char *path,
char * const argv[] );

Аргументы:

path
Путь к файлу, который необходимо выполнить.
argv
Массив указателей на строки, завершаемые NULL. Необходимо, чтобы этот массив был завершен указателем на NULL. Эти строки составляют список аргументов, доступных для образа нового процесса. Аргумент arg0 должен указывать на имя файла, связанного с запускаемым процессом.

Библиотека:

libc

Описание:

Функция execv() заменяет образ текущего процесса на образ нового процесса, определенного в path. Новый образ создается из обычного исполняемого файла, называемого файлом образа нового процесса. Возврата не происходит, поскольку образ вызывающего процесса заменяется образом нового процесса.

Когда программа на языке C запускается в результате этого вызова, она вызывается как функция C следующим образом:

int main( int argc, char *argv[] );

где argc - количество аргументов, а argv - массив символьных указателей на аргументы. Кроме того, следующая переменная:

extern char **environ;

инициализируется как указатель на массив символьных указателей на переменные окружения. Массивы argv и environ завершаются указателями на NULL. Указатель на NULL, завершающий массив argv, не входит в количество argc.

Многопоточные приложения не должны использовать переменную environ для доступа или модификации какой-либо переменной окружения в то же время, как любой другой поток изменяет любую переменную среды. Вызов любой функции, зависящей от любой переменной окружения, считается использованием переменной environ для доступа к переменной окружения.

Аргументы, указанные программе в одной из функций exec*(), передаются образу нового процесса как соответствующие аргументы main().

Окружение образа нового процесса берется из внешней переменной environ в вызывающем процессе.

Количество байт, доступное для объединенного списка аргументов и переменных среды нового процесса, определяется 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.

Коды ошибок:

E2BIG
Список аргументов и переменных среды больше, чем установленный системный предел в ARG_MAX байт.
EACCESS
Вызывающий процесс не имеет разрешения для поиска директории path, либо разрешения на выполнение path, либо файловая система, содержащая path, смонтирована с флагом ST_NOEXEC.
ELOOP
Слишком много уровней символических ссылок или префиксов.
ENAMETOOLONG
Длина path или элемента переменной окружения PATH превышает PATH_MAX.
ENOENT
Один или более компонентов пути к файлу не существует, либо аргумент path указывает на пустую строку.
ENOEXEC
Файл образа нового процесса имеет нужные разрешения доступа, но некорректного формата.
ENOMEM
Недостаточно памяти для создания нового процесса.
ENOTDIR
Часть path не является директорией.
ETXTBSY
Текстовый файл, который планируется выполнить, занят (например, он может быть открыт для записи).

Примеры:

#include <stddef.h>
#include <process.h>
char *arg_list[] = { "myprog", "ARG1", "ARG2", NULL };
execv( "myprog", arg_list );

Заменить текущий процесс myprog, как если бы пользователь запускал:

myprog ARG1 ARG2

в консоли.

В данном примере myprog будет найдена, если она присутствует в текущей рабочей директории.

Классификация:

POSIX 1003.1

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

abort(), atexit(), close(), errno, execl(), execle(), execlp(), execlpe(), execve(), execvp(), execvpe(), _exit(), exit(), getenv(), main(), putenv(), spawn(), spawnl(), spawnle(), spawnlp(), spawnlpe(), spawnp(), spawnv(), spawnve(), spawnvp(), spawnvpe(), system()




Предыдущий раздел: Описание API системной библиотеки