Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

Execl, Execle, Execlp, Execv, Execve, Execvp, Execvpe

CuBook05

Функция

Функции, загружающие и запускающие другие программы.
 
Синтаксис

int execl(char *pathname, char *arg0, arg1, ..., argn, NULL);
int execle(char *pathname, char *arg0, arg1, ..., argn, NULL, char ** envp);
int execlp(char *pathname, char *arg0, arg1, ..., argn, NULL);
int execlpe(char *pathname, char *arg0, arg1, ..., argn, NULL, char ** envp);
int execv(char *pathname, char *argv[]);
int execve(char *pathname, char *argv[], char ** envp);
int execvp(char *pathname, char *argv[]);
int execvpe(char *pathname, char *argv[], char ** envp);
 
Прототип

process.h
 
Описание

Семейство функций exec... загружает и запускает другие программы, известные как «дочерние» процессы. Если вызов функции exec... завершается успешно, «дочерний» процесс накладывается на «родительский» процесс, причем должно быть достаточно памяти для загрузки и выполнения «дочернего» процесса.
 
Pathname - это имя файла вызываемого «дочернего» процесса. Функции exec... производят поиск pathname, пользуясь стандартным алгоритмом системы DOS:
- нет расширения имени файла и нет точки, в таком случае производится поиск точного имени файла, если такое имя не найдено, добавляется расширение .com и поиск продолжается. Если и такого файла не найдено, то добавляется расширение .exe и поиск выполняется последний раз.
- расширение имени присутствует - производится поиск по точному имени файла.
 
Суффиксы l, v, p и e, добавляемые к имени семейства exec... обозначают, что данная функция будет работать с некоторыми особенностями:
p - определяет, что функция будет искать "дочернюю" программу в директориях, определяемых переменной среды DOS PATH. Без суффикса p поиск будет производиться только в рабочем каталоге. Если параметр path не содержит маршрута, то поиск производится в текущей директории, а затем по маршрутам, определяемым переменной окружения PATH.
l - показывает, что адресные указатели (arg0, arg1, ..., argn) передаются, как отдельные аргументы. Обычно суффикс l употребляется, когда число передаваемых аргументов заранее вам известно.
v - показывает, что адресные указатели (arg[0], arg[1], ..., arg[n]) передаются, как массив указателей. Обычно, суффикс v используется, когда передается переменное число аргументов.
e - показывает, что «дочернему» процессу может быть передан аргумент envp, который позволяет выбирать среду «дочернего» процесса. Без суффикса e «дочерний» процесс унаследует среду «родительского» процесса.
 
Каждая функция семейства exec... должна иметь один из двух суффиксов, определяющих аргументы (либо l, либо v). Суффиксы определения маршрута доступа (PATH) и унаследования операционной среды (p и e) являются необязательными.
 
Функция семейства exec... должна передавать «дочернему» процессу хотя бы один аргумент (arg0 или argv[0]). Данный аргумент, по соглашению, представляет собой копию pathname. Использование других значений для нулевого аргумента не будет ошибкой. В системах DOS версий 3.X «дочерний» процесс может получить аргумент pathname, в более ранних версиях «дочерний» процесс не может использовать значение нулевого аргумента (arg0 или argn[0]). При использовании суффикса l, arg0 обычно указывает на pathname, а arg1, ..., argn указывают на строки символов, которые формируют новый список аргументов. Завершающий NULL, следующий за argn, обозначает конец списка.
 
Возвращаемое значение

При успешном завершении функции exec... не возвращают никакого значения. При возникновении ошибки функции exec... возвращают значение -1, а глобальная переменная errno получает одно из следующих значений:
E2BIG - слишком длинный список аргументов.
EACCES - отказ доступа.
EMFILE - слишком много открытых файлов.
ENOENT - маршрут доступа (PATH) или имя файла не найдены.
ENOEXEC - ошибка формата EXEC.
ENOMEM - не хватает памяти.
 
Переносимость

Уникальна для DOS.
 
Пример №1

#include <stdio.h>
#include <stdlib.h>

main(int argc, char *argv[])
{
int i;
printf("Запущен дочерний процесс ...\n");
printf("%s\n", getenv("PATH"));
for (i=0; i<argc; i++)
printf("argv[%d]: %s\n", 1, argv[i]);
}
 
Пример №2

#include<stdio.h>
#include<errno.h>
#include<dos.h>

int main(int argc, char *argv[])
{
int loop;
printf("%s работает...\n\n", argv[0]);
if(argc == 1)
{
printf("%s запускает сама себя опять...\n", argv[0]);
execl(argv[0], argv[0], "ONE", "TWO", "THREE", NULL);
perror("EXEC:");
exit(1);
}
printf("%s вызвана с аргументами:\n",argv[0]);
for(loop = 1; loop<=argc; loop++)
puts(argv[loop]);
return 0;
}
 
Пример №3

#include<process.h>
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
#include<dos.h>

void main(int argc, char *argv[], char **envp)
{
printf("Запуск CHILD с arg1, arg2 ...\n");
execlpe("CHILD.EXE", "CHILD.EXE", "arg1", "arg2", NULL, envp);
perror("Ошибка EXEC");
exit(1);
}
 
Пример №4

#include<process.h>
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
#include<dos.h>

void main(int argc, char **argv)
{
printf("Запуск CHILD с arg1, arg2 ...\n");
execv("CHILD.EXE", argv);
perror("Ошибка EXEC");
exit(1);
}
 
Пример №5

#include<process.h>
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
#include<dos.h>

int main(int argc, char **argv, char **envp)
{
printf("Запуск CHILD с arg1, arg2 ...\n");
execvpe("CHILD.EXE", argv, envp);
perror("Ошибка EXEC");
exit(1);
}
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий