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

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

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

Номенклатура

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

Стандартные названия таких функций в C находятся execl, экзекль, 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 * путь, char const * arg0, ..., char const * envp []);
int execlp (char const * файл, char const * arg0, ...);
int execv (char const * путь, char const * argv []);
int execve (char const * путь, char const * argv [], char const * envp []);
int execvp (char const * файл, char const * argv []);

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

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

е - Массив указателей на переменные среды явно передается в новый образ процесса.
лАргументы командной строки проходят индивидуально ( лist) к функции.
п - Использует Переменная среды PATH найти файл с именем в файл аргумент для выполнения.
v - Аргументы командной строки передаются функции в виде массива (vэктор) указателей.
дорожка

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

arg0

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

envp

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

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

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

куда имя - это имя переменной среды, а ценить значение этой переменной. Последний элемент 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

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

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

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

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

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

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

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

Другие системы

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

Смотрите также

Рекомендации

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

внешняя ссылка