exec (системный вызов)
Эта статья нуждается в дополнительных цитатах для проверки . ( февраль 2024 г. ) |
В вычислительной технике exec — это функция операционной системы , которая запускает исполняемый файл в контексте уже существующего процесса , заменяя предыдущий исполняемый файл. Это действие также называется наложением . Это особенно важно в Unix-подобных системах, хотя оно существует и в других местах. Поскольку новый процесс не создается, идентификатор процесса (PID) не меняется, но машинный код , данные , куча и стек процесса заменяются кодами новой программы.
Вызов exec , доступен для многих языков программирования включая компилируемые языки и некоторые языки сценариев . В команд ОС интерпретаторах exec Встроенная команда заменяет процесс оболочки указанной программой. [1]
Номенклатура
[ редактировать ]Интерфейсы для выполнения и его реализации различаются. В зависимости от языка программирования он может быть доступен через одну или несколько функций , а в зависимости от операционной системы он может быть представлен одним или несколькими системными вызовами . По этой причине exec иногда называют набором функций .
Стандартные имена таких функций в C : отлично , execle , execlp , исполнительный директор , исполнять и execvp (см. ниже ), но не сам exec. Ядро Linux имеет один соответствующий системный вызов с именем «execve», тогда как все вышеупомянутые функции являются оболочками в пользовательском пространстве его .
Языки более высокого уровня обычно предоставляют один вызов с именем исполнительный .
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 для поиска файла, указанного в аргументе файла , который будет выполнен.
- v – Аргументы командной строки передаются функции как массив ( вектор ) указателей.
- путь
Аргумент указывает путь к файлу, который будет выполняться в качестве нового образа процесса. Аргументы, начинающиеся с arg0, являются указателями на аргументы, которые будут переданы в новый образ процесса. Значение argv представляет собой массив указателей на аргументы.
- аргумент0
Первый аргумент arg0 должен быть именем исполняемого файла. Обычно это то же значение, что и аргумент пути . Некоторые программы могут ошибочно полагаться на этот аргумент, указывая расположение исполняемого файла, но это не гарантируется и не стандартизировано для разных платформ.
- конверт
Аргумент envp — это массив указателей на настройки среды. Вызовы exec изменяют среду для с именем, заканчивающимся на e, нового образа процесса, передавая список настроек среды через аргумент envp . Этот аргумент представляет собой массив указателей на символы; каждый элемент (кроме последнего элемента) указывает на строку с нулевым завершением, определяющую переменную среды .
Каждая строка с нулевым завершением имеет форму:
name=value
где name — это имя переменной среды, а value — это значение этой переменной. Последний элемент массива envp должен иметь значение null .
В отлично , execlp , исполнительный и execvp , новый образ процесса наследует текущие переменные среды.
Эффекты
[ редактировать ]Дескриптор файла , открытый при exec , остается открытым в новом образе процесса, если только он не был вызове fcntl открывается с помощью FD_CLOEXEC или открывается с помощью O_CLOEXEC (последний был введен в POSIX.1-2001). Этот аспект используется для указания стандартных потоков (stdin, stdout и stderr) новой программы.
Успешное наложение уничтожает предыдущее адресное пространство памяти процесса, и все его области памяти, которые не были разделены , освобождаются операционной системой. Следовательно, все его данные, которые не были переданы в новую программу или сохранены иным образом, теряются.
Возвращаемое значение
[ редактировать ]Успешное выполнение заменяет текущий образ процесса, поэтому он не может ничего вернуть программе, выполнившей вызов. У процессов есть статус завершения , но это значение собирается родительским процессом .
Если функция exec все-таки возвращается в вызывающую программу, возникает ошибка, возвращаемое значение равно -1, а errno устанавливается в одно из следующих значений:
Имя | Примечания |
---|---|
E2BIG | Список аргументов превышает системный предел. |
ЕАКСЕС | Указанный файл имеет нарушение блокировки или общего доступа. |
ЭНОЕНТ | Имя файла или пути не найдено. |
ЭНОМЕМ | Недостаточно памяти для выполнения нового образа процесса. |
Операционные системы ДОС
[ редактировать ]DOS не является многозадачной операционной системой, но замена предыдущего исполняемого образа имеет здесь большое преимущество из-за жестких ограничений первичной памяти и отсутствия виртуальной памяти . Тот же API используется для наложения программ в DOS и имеет эффекты, аналогичные эффектам в системах POSIX.
Функции MS-DOS exec программы всегда загружают новую программу в память, как если бы «максимальное выделение» в заголовке исполняемого файла установлено на значение по умолчанию 0xFFFF. Утилита EXEHDR может использоваться для изменения максимального поля выделения программы. Однако если это сделано и программа вызывается с помощью одной из функций exec , программа может вести себя иначе, чем программа, вызванная непосредственно из командной строки операционной системы или с помощью одной из функций создания (см. ниже ).
Командные переводчики
[ редактировать ]Многие оболочки Unix также имеют встроенную команда exec , которая заменяет процесс оболочки указанной программой. [1] Сценарии- оболочки часто используют эту команду для запуска программы (напрямую, через интерпретатор или виртуальную машину ) после установки переменных среды или другой конфигурации. При использовании exec ресурсы, используемые программой оболочки, не должны оставаться в использовании после запуска программы. [2]
The Команда exec также может выполнить перенаправление . В некоторых оболочках можно даже использовать exec только для перенаправления, без создания фактического наложения.
Альтернативы
[ редактировать ]Традиционная система Unix не имеет возможности создать новый процесс, запускающий новую исполняемую программу за один шаг, что объясняет важность exec для программирования Unix. Другие системы могут использовать spawn в качестве основного инструмента для запуска исполняемых файлов. Его результат эквивалентен последовательности fork-exec в Unix-подобных системах. POSIX поддерживает процедуры posix_spawn как дополнительное расширение, которое обычно реализуется с помощью vfork .
Другие системы
[ редактировать ]OS/360 и его преемники включают системный вызов XCTL (управление передачей), который выполняет функцию, аналогичную exec.
См. также
[ редактировать ]- Цепная загрузка , наложение в системном программировании
- выход (системный вызов) , завершить процесс
- fork (системный вызов) , создать новый процесс (но с тем же исполняемым файлом)
- clone() , способ создания новых потоков
- PATH (переменная) , связанная с семантикой пути * аргумент
Ссылки
[ редактировать ]- ^ Jump up to: а б «exec(3) — страница руководства Linux» . man7.org . Проверено 14 октября 2016 г.
- ^ «Обертки из ракушек» . Проект документации Linux . 10 марта 2014 г. Проверено 18 февраля 2021 г.
Внешние ссылки
[ редактировать ]- Единая спецификация UNIX , версия 4 от The Open Group : выполнить файл — Справочник по системным интерфейсам,