о системном вызове fork и execve - PullRequest
9 голосов
/ 29 мая 2009

Говорят, что системный вызов fork создает клон вызывающего процесса, а затем (обычно) дочерний процесс выдает системный вызов execve, чтобы изменить свой образ и запустить новый процесс. Почему этот двухступенчатый?

Кстати, что означает execve? 1006 *

Ответы [ 5 ]

15 голосов
/ 31 мая 2009

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

Некоторые вещи, которые вы можете изменить:

  • Файловые дескрипторы
  • ID пользователя / группы
  • ID группы процессов и сеансов
  • Текущий каталог
  • Пределы ресурса
  • Планирование приоритета и сходства
  • Маска создания файла (umask)

Если вы не разделили fork и exec и вместо этого имели один системный вызов, похожий на spawn, то для каждого из этих атрибутов процесса потребовались бы аргументы, если вы хотите, чтобы они устанавливались по-разному в дочернем процессе. Например, см. Список аргументов для CreateProcess в Windows API.

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

Настройка файловых дескрипторов является одной из наиболее распространенных вещей, которые необходимо изменить в контексте дочернего процесса. Если вы хотите захватить выходные данные программы, вы обычно создаете канал в родительском элементе с помощью системного вызова pipe (2), а после fork (2) вы закрываете конец записи в родительском процессе и закрываете прочитайте end в дочернем процессе перед вызовом execve (2). (Вы также будете использовать dup (2), чтобы установить дочерний конец канала в дескриптор файла 1 (stdout)). Это было бы либо невозможно, либо ограничительно в одном системном вызове.

11 голосов
/ 29 мая 2009
  • exec: выполнить новый процесс
  • v: использовать массив аргументов
  • e: указать также среду

Другие варианты exec имеются в большом количестве:

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
  • l: список аргументов для функции
  • p: используйте $ PATH для поиска исполняемого файла
8 голосов
/ 29 мая 2009

Каждый шаг относительно прост.

В Unix ваш процесс состоит из двух частей - области памяти только для чтения с кодом приложения («текст») и области памяти для чтения и записи («данные»).

Вилка клонирует область чтения-записи, оставляя текстовую страницу в покое. Теперь у вас есть два процесса, выполняющих один и тот же код. Они отличаются значением регистра - возвращаемым значением от fork - который отделяет родительский элемент от дочернего.

Исполнитель заменяет текстовую страницу, оставляя страницу данных в покое. Существует много форм исполнения, в зависимости от того, сколько информации об окружающей среде вы передаете ему. См. http://linux.die.net/man/3/exec для дополнительного списка вариантов.

3 голосов
/ 29 мая 2009

Семейство функций "exec" заменяет текущий образ процесса (откуда он вызывается) новым образом процесса, поэтому вызывающий образ заменяется новым образом процесса. Например, если бы вы запускали команду 'ls' из оболочки (/ bin / sh или / bin / csh), то оболочка превратилась бы в новый процесс, который затем выполнил бы ls. Как только команда ls завершает работу, она возвращает управление родительскому процессу, который в этом примере является оболочкой.

Если бы не было функциональности fork, то оболочка была бы заменена процессом 'ls', который при выходе оставил бы вас с недоступным терминалом, так как образ оболочки в памяти был заменен после вызова exec ls.

Варианты в семействе 'exec' см. В ответе 0x6adb015.

0 голосов
/ 18 марта 2018

Что означает execve?

Шесть вариантов функций exec в C: exec{l,v}{,e,p}. См. Ниже прототипы функций.

Аргументы командной строки

  • v - Аргументы командной строки передаются в функцию в виде массива ( v ector) указателей.
  • l - Аргументы командной строки передаются индивидуально ( l ist) в функцию.

Переменные среды (необязательно)

  • e - Массив указателей на e переменных среды явно передается в новый образ процесса

Найдите файл для выполнения (необязательно)

  • p - использует переменную среды P ATH, чтобы найти файл , названный в аргументе файла для выполнения

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[]);

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...