Для семейства вызовов linuxexecl аргументы
uses stdio;
(* Для семейства вызовов linuxexecl аргументы должны быть списком,
заканчивающимся NULL *)
function linuxexecl(path:pchar;arg0:pchar;argv:array of const):integer;
function linuxexeclp(fname:pchar;arg0:pchar;argv:array of const):integer;
(* Вызову execl нужно передать полный путь к файлу программы *)
Procedure Execl(Path:pathstr);
(* Вызову execle нужно передать полный путь к файлу программы
и массив указателей на строки окружения *)
Procedure Execle(Path:pathstr; Envp:ppchar);
(* Вызову ехесlp нужно только имя файла программы *)
Procedure Execlp(Path:pathstr);
(* Семейству вызовов execv нужно передать массив аргументов *)
(* Вызову execv нужно передать полный путь к файлу программы *)
Procedure Execv(Path:pathstr;argv:ppchar);
(* Вызову execvp нужно только имя файла программы *)
Procedure Execvp(Path:pathstr;argv:ppchar);
(* Вызову execve нужно передать полный путь к файлу программы
и массив указателей на строки окружения *)
Procedure Execve(Path:pchar;argv:ppchar;envp:ppchar);
Procedure Execve(Path:pathstr;argv,envp:ppchar);
execl
|
execle
|
execlp
|
v
|
|
v
|
execv
|
|
execvp
|
|
|
|
|
execve
|
|
Рис. 5.2. Дерево семейства вызовов ехес
Все множество системных вызовов ехес выполняет одну и ту же функцию: они преобразуют вызывающий процесс, загружая новую программу в его пространство памяти. Если вызов ехес завершился успешно, то вызывающая программ полностью замещается новой программой, которая запускается с начала. Результат вызова можно рассматривать как запуск нового процесса, который при этом сохраняет идентификатор вызывающего процесса и по умолчанию наследует файловые дескрипторы (см. пункт 5.5.2).
Важно отметить, что вызов ехес не создает новый подпроцесс, который выполняется одновременно с вызывающим, а вместо этого новая программа загружается на место старой. Поэтому, в отличие от вызова fork, успешный вызов ехеc не возвращает значения.
Содержание Назад Вперед