В вычислении , 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[]);
Некоторые реализации предоставляют эти функции, имена которых начинаются с подчеркивания (например, _execl).
Основание каждого - exec (выполнение), за которым следует одна или несколько букв:
- e - массив указателей на переменные среды явно передается новому образу процесса.
- л - Аргументы командной строки передаются по отдельности (а л IST) к функции.
- p - использует переменную среды PATH, чтобы найти файл, указанный в аргументе файла, который должен быть выполнен.
- v - аргументы командной строки передаются функции в качестве массива ( об Экторе) указателей.
- дорожка
Аргумент указывает путь к файлу, который будет выполняться как новый образ процесса. Аргументы, начинающиеся с arg0, являются указателями на аргументы, передаваемые в новый образ процесса. Значение argv - это массив указателей на аргументы.
- arg0
Первым аргументом arg0 должно быть имя исполняемого файла. Обычно это то же значение, что и аргумент пути . Некоторые программы могут ошибочно полагаться на этот аргумент при указании местоположения исполняемого файла, но это не является гарантией этого и не стандартизировано для разных платформ.
- envp
Аргумент envp - это массив указателей на настройки среды. В Exec вызовы по имени , оканчивающиеся на е изменить окружение нового образа процесса, передавая список параметров среды через envp аргумент. Этот аргумент представляет собой массив символьных указателей; каждый элемент (кроме последнего элемента) указывает на строку с завершающим нулем, определяющую переменную среды .
Каждая строка с завершающим нулем имеет форму:
name=value
где имя - это имя переменной среды, а значение - это значение этой переменной. Последний элемент массива envp должен быть нулевым .
В вызовах execl , execlp , execv и execvp новый образ процесса наследует текущие переменные среды.
Эффекты [ править ]
Дескриптор файла открывается при Exec сделан вызов остается открытым в новом образе процесса, если не было Fcntl ред с FD_CLOEXEC или открыт с O_CLOEXEC (последний был введен в POSIX.1-2001). Этот аспект используется для указания стандартных потоков (stdin, stdout и stderr) новой программы.
Успешное наложение уничтожает предыдущее адресное пространство памяти процесса, и все его области памяти, которые не использовались совместно , освобождаются операционной системой. Следовательно, все данные, которые не были переданы новой программе или сохранены иным образом, теряются.
Возвращаемое значение [ править ]
Успешный exec заменяет текущий образ процесса, поэтому он не может ничего вернуть программе, которая сделала вызов. У процессов есть статус выхода , но это значение собирается родительским процессом .
Если функция exec действительно возвращается к вызывающей программе, возникает ошибка, возвращаемое значение равно -1, а errno устанавливается в одно из следующих значений:
Имя | Заметки |
---|---|
E2BIG | Список аргументов превышает системный предел. |
EACCES | Указанный файл имеет нарушение блокировки или совместного использования. |
ENOENT | Имя файла или путь не найдены. |
ЭНОМЕМ | Недостаточно памяти для выполнения нового образа процесса. |
Операционные системы DOS [ править ]
DOS не является многозадачной операционной системой, но замена предыдущего исполняемого образа имеет здесь большое преимущество из-за жестких ограничений первичной памяти и нехватки виртуальной памяти . Тот же API используется для наложения программ в DOS, и его эффекты аналогичны таковым в системах POSIX.
Функции exec MS-DOS всегда загружают новую программу в память, как если бы «максимальное выделение» в заголовке исполняемого файла программы было установлено на значение по умолчанию 0xFFFF. Утилиту EXEHDR можно использовать для изменения максимального поля выделения памяти программы. Однако, если это сделано и программа вызывается с помощью одной из функций exec , программа может вести себя иначе, чем программа, вызванная непосредственно из командной строки операционной системы или с одной из функций порождения (см. Ниже ).
Интерпретаторы команд [ править ]
Многие оболочки Unix также предлагают встроенную команду exec, которая заменяет процесс оболочки указанной программой. [1] Скрипты- оболочки часто используют эту команду для запуска программы (напрямую или через интерпретатор или виртуальную машину ) после установки переменных среды или другой конфигурации. При использовании exec ресурсы, используемые программой оболочки, не должны оставаться в использовании после запуска программы. [2]
Команда exec также может выполнять перенаправление . В некоторых оболочках можно даже использовать команду exec только для перенаправления без фактического наложения.
Альтернативы [ править ]
Традиционная система Unix не имеет функциональных возможностей для создания нового процесса, запускающего новую исполняемую программу за один шаг, что объясняет важность exec для программирования Unix. Другие системы могут использовать spawn в качестве основного инструмента для запуска исполняемых файлов. Его результат эквивалентен последовательности fork-exec Unix-подобных систем. POSIX поддерживает подпрограммы posix_spawn как дополнительное расширение, которое обычно реализуется с помощью vfork .
Другие системы [ править ]
OS / 360 и ее последователи включают системный вызов XCTL (управление передачей), который выполняет функцию, аналогичную функции exec.
См. Также [ править ]
- Цепная загрузка , наложение в системном программировании
- exit (системный вызов) , завершить процесс
- fork (системный вызов) , создать новый процесс (но с тем же исполняемым файлом)
- clone () , способ создания новых потоков
- PATH (переменная) , связанная с семантикой аргумента * path
Ссылки [ править ]
- ^ a b "exec (3) - страница руководства Linux" . man7.org . Проверено 14 октября 2016 .
- ^ "Shell Wrappers" . Проект документации Linux . 2014-03-10 . Проверено 18 февраля 2021 .
Внешние ссылки [ править ]
- : выполнить файл - Справочник по системным интерфейсам, Единая спецификация UNIX , Выпуск 7 от The Open Group