Из Википедии, бесплатной энциклопедии
  (Перенаправлено из Execve )
Перейти к навигации Перейти к поиску

В вычислении , 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 устанавливается одно из следующих значений:

Операционные системы 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

Ссылки [ править ]

  1. ^ a b "exec (3) - страница руководства Linux" . man7.org . Проверено 14 октября 2016 .
  2. ^ 36.2. Shell Wrappers . Tldp.org. Проверено 1 января 2013.

Внешние ссылки [ править ]

  • exec: выполнить файл - Справочник по системным интерфейсам, Единая спецификация UNIX , Выпуск 7 от The Open Group