Jump to content

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

В вычислительной технике 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.

См. также

[ редактировать ]
  1. ^ Jump up to: а б «exec(3) — страница руководства Linux» . man7.org . Проверено 14 октября 2016 г.
  2. ^ «Обертки из ракушек» . Проект документации Linux . 10 марта 2014 г. Проверено 18 февраля 2021 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 0842e191dec89652cba6b1482e3c1aae__1721264700
URL1:https://arc.ask3.ru/arc/aa/08/ae/0842e191dec89652cba6b1482e3c1aae.html
Заголовок, (Title) документа по адресу, URL1:
exec (system call) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)