stringtranslate.com

exec (системный вызов)

В вычислительной технике exec это функциональная возможность операционной системы , которая запускает исполняемый файл в контексте уже существующего процесса , заменяя предыдущий исполняемый файл. Этот акт также называется наложением . Он особенно важен в Unix-подобных системах, хотя существует и в других местах. Поскольку новый процесс не создается, идентификатор процесса (PID) не изменяется, но машинный код , данные , куча и стек процесса заменяются на данные новой программы.

Вызов exec доступен для многих языков программирования , включая компилируемые языки и некоторые языки сценариев . В интерпретаторах команд ОС встроенная команда exec заменяет процесс оболочки указанной программой. [1]

Номенклатура

Интерфейсы exec и его реализации различаются. В зависимости от языка программирования он может быть доступен через одну или несколько функций , а в зависимости от операционной системы он может быть представлен одним или несколькими реальными системными вызовами . По этой причине exec иногда описывается как набор функций .

Стандартные имена таких функций в C — execl , execle , execlp , execv , execve и execvp (см. ниже), но не само «exec». Ядро Linux имеет один соответствующий системный вызов с именем «execve», тогда как все вышеупомянутые функции являются оболочками пользовательского пространства вокруг него.

Языки более высокого уровня обычно предоставляют один вызов с именем exec .

Unix, POSIX и другие многозадачные системы

Прототипы языка C

Стандарт POSIX объявляет функции exec в заголовочном файле unistd.h на языке C. Те же функции объявляются в process.h для DOS (см. ниже), OS/2 и Microsoft Windows.

int execl(char const *path, char const *arg0, ...);int execle(char const *path, char const *arg0, ..., char const *envp[]);int execlp(char const *file, char const *arg0, ...);int execv(char const *path, char const *argv[]);int execve(char const *path, char const *argv[], char const *envp[]);int execvp(char const *file, char const *argv[]);int fexecve(int fd, char *const argv[], char *const envp[]);

В некоторых реализациях имена этих функций начинаются с подчеркивания (например, _execl).

Основой каждого слова является exec (выполнять), за которым следует одна или несколько букв:

e – Массив указателей на переменные среды явно передается в новый образ процесса.
lАргументы командной строки передаются в функцию по отдельности (списком) .
p – Использует переменную среды PATH для поиска файла, указанного в аргументе file, который необходимо выполнить.
v – Аргументы командной строки передаются функции в виде массива ( вектора ) указателей.
путь

Аргумент указывает путь к файлу для выполнения в качестве нового образа процесса. Аргументы, начинающиеся с arg0, являются указателями на аргументы, которые должны быть переданы новому образу процесса. Значение argv является массивом указателей на аргументы.

арг0

Первый аргумент arg0 должен быть именем исполняемого файла. Обычно это то же значение, что и аргумент path . Некоторые программы могут неправильно полагаться на этот аргумент, предоставляя местоположение исполняемого файла, но это не гарантируется и не стандартизировано между платформами.

envp

Аргумент envp — это массив указателей на параметры среды. Вызовы exec , именованные с окончанием e, изменяют среду для нового образа процесса, передавая список параметров среды через аргумент envp . Этот аргумент — массив указателей на символы; каждый элемент (за исключением последнего) указывает на строку с нулевым завершением, определяющую переменную среды .

Каждая строка с нулевым символом в конце имеет вид:

name=value

где name — имя переменной окружения, а value — значение этой переменной. Последний элемент массива envp должен быть null .

В вызовах execl , execlp , execv и execvp новый образ процесса наследует текущие переменные среды.

Эффекты

Файловый дескриптор , открытый при вызове exec , остается открытым в новом образе процесса, если только он не был fcntl с FD_CLOEXEC или открыт с O_CLOEXEC (последний был введен в POSIX.1-2001). Этот аспект используется для указания стандартных потоков (stdin, stdout и stderr) новой программы.

Успешное наложение уничтожает предыдущее адресное пространство памяти процесса, и все его области памяти, которые не были общими , возвращаются операционной системой. Следовательно, все его данные, которые не были переданы новой программе или иным образом сохранены, теряются.

Возвращаемое значение

Успешный exec заменяет текущий образ процесса, поэтому он не может ничего вернуть программе, которая сделала вызов. Процессы имеют статус выхода , но это значение собирается родительским процессом .

Если функция exec возвращает управление вызывающей программе, возникает ошибка, возвращаемое значение равно -1, а errno устанавливается в одно из следующих значений:

Операционные системы DOS

DOS не является многозадачной операционной системой, но замена предыдущего исполняемого образа имеет большое преимущество из-за жестких ограничений первичной памяти и отсутствия виртуальной памяти . Тот же API используется для наложения программ в DOS и имеет эффекты, аналогичные эффектам в системах POSIX.

Функции exec MS-DOS всегда загружают новую программу в память, как будто "максимальное распределение" в заголовке исполняемого файла программы установлено на значение по умолчанию 0xFFFF. Утилиту EXEHDR можно использовать для изменения поля максимального распределения программы. Однако, если это сделано и программа вызывается с помощью одной из функций exec , программа может вести себя иначе, чем программа, вызываемая напрямую из командной строки операционной системы или с помощью одной из функций spawn (см. ниже).

Интерпретаторы команд

Многие оболочки Unix также предлагают встроенную команду exec , которая заменяет процесс оболочки указанной программой. [1] Скрипты- оболочки часто используют эту команду для запуска программы (напрямую или через интерпретатор или виртуальную машину ) после установки переменных окружения или другой конфигурации. При использовании exec ресурсы, используемые программой оболочки, не должны оставаться в использовании после запуска программы. [2]

Команда exec также может выполнять перенаправление . В некоторых оболочках даже возможно использовать команду exec только для перенаправления, без создания фактического наложения.

Альтернативы

Традиционная система Unix не имеет функциональности для создания нового процесса, запускающего новую исполняемую программу за один шаг, что объясняет важность exec для программирования Unix. Другие системы могут использовать spawn в качестве основного инструмента для запуска исполняемых файлов. Его результат эквивалентен последовательности fork–exec в Unix-подобных системах. POSIX поддерживает процедуры posix_spawn как необязательное расширение, которое обычно реализуется с помощью vfork .

Другие системы

OS/360 и ее последователи включают системный вызов XCTL (управление передачей), который выполняет функцию, аналогичную exec.

Смотрите также

Ссылки

  1. ^ ab "exec(3) - Страница руководства Linux". man7.org . Получено 2016-10-14 .
  2. ^ "Shell Wrappers". Проект документации Linux . 2014-03-10 . Получено 2021-02-18 .

Внешние ссылки