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

редактировать

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

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

Содержание
  • 1 Номенклатура
  • 2 Unix, POSIX и другие многозадачные системы
    • 2.1 Прототипы языка C
    • 2.2 Эффекты
    • 2.3 Возвращаемое значение
  • 3 Операционные системы DOS
  • 4 Интерпретаторы команд
  • 5 Альтернативы
  • 6 Другие системы
  • 7 См. также
  • 8 Ссылки
  • 9 Внешние ссылки
Номенклатура

Интерфейсы для 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 * путь, 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 * путь, char const * argv, char const * envp);
int execvp (char const * file, char const * argv);

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

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

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

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

arg0

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

envp

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

Каждая строка с завершающим нулем имеет форму:

имя = значение

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

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

Эффекты

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

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

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

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

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

NameПримечания
E2BIGСписок аргументов превышает системный предел.
EACCESУказанный файл имеет нарушение блокировки или совместного использования.
ENOENTИмя файла или путь не найдены.
ENOMEMНедостаточно памяти для выполнения нового образа процесса.
Операционные системы DOS

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

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

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

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

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

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

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

Other Systems

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

См. Также
Ссылки
  1. ^ «exec (3) - страница руководства Linux». man7.org. Проверено 14 октября 2016 г.
  2. ^36.2. Панцирные обертки. Tldp.org. Проверено 1 января 2013.
Внешние ссылки
Последняя правка сделана 2021-05-19 09:34:54
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте