В чем разница между функциями семейства exec системных вызовов типа exec и execve?

Я недавно изучал курс системного программирования, и я пришел через системные вызовы exec() и execve(). До сих пор я не могу найти разницы между этими двумя, даже Wikipedia не дает ясного объяснения, так что есть разница между exec() и execve().

И кто-то может дать краткие описания системных вызовов семейства exec, таких как execl(), execv(), execle(), execvp().

Ответ 1

Используйте man exec и прочитайте:

The execv(), execvp(), and execvpe() functions provide an array of pointers to 
null-terminated strings that represent the argument list available to the new program. 
The first argument, by convention, should point to the filename associated with the file 
being executed. The array of pointers must be terminated by a NULL pointer. 

execv

int execv(const char *path, char *const argv[]);

Таким образом, вы передаете массив в качестве параметров

int execle(const char *path, const char *arg,
              ..., char * const envp[]);

Почти то же самое, но не как массив, а как список значений (строк), за которым следует массив, обозначающий среду.

Вот:

int execvp(const char *file, char *const argv[]);

Вы вызываете файл без пути, поэтому он ожидает, что вы уже находитесь на правильном path перед вызовом.

Последний, но тем не менее важный:

int execve(const char *filename, char *const argv[],
                  char *const envp[]);

Аналогичен предыдущему, но теперь у вас есть два массива для аргументов и переменных среды.

Ответ 2

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

  • Вызовы с v в имени принимают параметр массива, чтобы указать массив argv[] новой программы.

  • Вызовы с l в имени принимают аргументы новой программы как список аргументов переменной длины для самой функции.

  • Вызовы с e в имени принимают дополнительный аргумент для обеспечения среды новой программы; в противном случае программа наследует текущую среду процесса.

  • Вызовы с p в имени ищут переменную среды PATH, чтобы найти программу, если в ней нет каталога (т.е. она не содержит символ /). В противном случае имя программы всегда рассматривается как путь к исполняемому файлу.

Ответ 3

Аргументы для этих функций различны.

  • Функция execl, execlp и execle требуют, чтобы каждый из аргументов командной строки в новую программу указывался как отдельные аргументы.

  • execv, execvp и execve, мы должны построить массив указателей на аргументы, а адрес этого массива является аргументом для этих трех функций.

  • Функции execve, execle позволяют передавать указатель на массив указателей на строки окружения. Другие четыре функции используют переменную environ в вызывающем процессе для копирования существующей среды в программу.

  • Буква p означает, что функции принимают аргумент имени файла и используют переменную среды PATH для поиска исполняемого файла.
  • Буква l означает, что функция принимает список аргументов и является взаимоисключающей с буквой v, что означает, что она принимает вектор argv [].
  • Буква e означает, что функция принимает массив envp[] вместо использования текущей среды.

  • Новая программа наследует следующие дополнительные функции вызывающего процесса.

    Process ID and the Parent Process ID
    Real user ID and Real Group ID
    Supplementary group IDs
    Process group ID
    Session ID
    Controlling terminal
    Time left until alarm clock
    Current working directory
    Root directory
    File mode creation mask
    File locks
    Process signal mask
    Pending signals
    Resource limits
    Values for tms_utime, tms_stime, tms_cutime, and tms_cstime.
  • Идентификатор реального пользователя и реальный идентификатор группы остаются неизменными в exec, но эффективные идентификаторы могут изменяться в зависимости от состояния идентификаторов set-user-id и битов set-group-id для исполняемого файла программы.

Ответ 4

Основная идея

Функция exec() заменяет существующий образ процесса новым образцом процесса. Это заметное отличие от системного вызова fork(), где родительский и дочерний процессы сосуществуют в памяти.

exec() семейство функций

int execv (const char *filename, char *const argv[])

Имя файла - это файл нового образа процесса.

argv представляет массив строк с нулевым завершением. Последний элемент этого массива должен быть нулевым указателем.

int execl (const char *filename, const char *arg0, …)

То же, что и execv, но аргументы предоставляются как отдельная строка (разделенная запятыми) вместо массива/вектора.

int execve (const char *filename, char *const argv[], char *const env[])

То же, что и execv, но позволяет указывать переменные среды для нового образа процесса.

int execle (const char *filename, const char *arg0, …, char *const env[])

То же, что и execl, но позволяет указывать переменные среды для нового образа процесса.

int execvp (const char *filename, char *const argv[])

То же, что и функция execv, но ищет стандартную переменную окружения PATH, чтобы найти имя файла, если имя файла не содержит косой черты.

Ниже приведен список стандартных переменных среды:

https://www.gnu.org/software/libc/manual/html_node/Standard-Environment.html#Standard-Environment

int execlp (const char *filename, const char *arg0, …)

То же, что и функция execl, за исключением того факта, что если выполняется поиск имени файла как функция execvp.

Примечание

В системе Linux, если вы наберете env или printenv на оболочке или терминале, вы получите список стандартных переменных среды.

Ответ 5

Поскольку вся эта функция принадлежит семейству exec(), позвольте мне differentiate в соответствии с extra characters со значениями,

1.exec в():

p: not present = > имя программы для запуска будет взято из pathname

Аргумент

v: present = > будет передан как array

e: present = > среда будет взята из envp argument

2.exec ле():

p: not present = > имя программы для запуска будет взято из pathname

Аргумент

l: present = > будет передан как list

e: present = > среда будет взята из envp argument

3.exec LP():

p: present = > имя запускаемой программы будет взято из указанного filename или system будет search for program file в переменной PATH.

Аргумент

l: present = > будет передан как list

e: not present = > среда будет взята из caller environ

4.exec VP():

p: present = > имя запускаемой программы будет взято из указанного filename или system будет search for program file в переменной PATH.

Аргумент

v: present = > будет передан как array

e: not present = > среда будет взята из caller environ

5.exec v():

p: not present = > имя программы для запуска будет взято из pathname

Аргумент

v: present = > будет передан как array

e: not present = > среда будет взята из caller environ

6.exec L():

p: not present = > имя программы для запуска будет взято из pathname

Аргумент

l: present = > будет передан как list

e: not present = > среда будет взята из caller environ

Ответ 6

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

  • Функции, содержащие букву p в своих именах (execvp и execlp), принимают имя программы и ищут программу под этим именем в текущем пути выполнения; функции, которые не содержат p, должны иметь полный путь к программе, которая должна быть выполнена.

  • Функции, содержащие букву v в своих именах (execv, execvp и execve), принимают список аргументов для новой программы как массив указателей с нулевым символом для строк. Функции, содержащие букву l (execl, execlp и execle) принять список аргументов, используя механизм языков varargs.

  • Функции, содержащие букву e в своих именах (execve и execle), принимают дополнительный аргумент, массив переменных окружения. Аргумент должен быть NULL-концевой массив указателей на символьные строки. Каждая символьная строка должен иметь вид VARIABLE=value.

Источник

Ответ 7

Чтобы ответить на первую часть вашего вопроса, в контексте Linux, существует только один системный вызов и execve (не exec). Остальная часть так называемого семейства exec ( execl, execle, execv, execve, execvp и т.д.) - это все оболочки GLIBC для системного вызова ядра, то есть execve.