Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ABORT.docx
Скачиваний:
2
Добавлен:
09.09.2019
Размер:
69.94 Кб
Скачать

Int fh, count;

char buf[10];

fh = open("data", O_RDONLY);

/* следующий оператор проверяет перед чтением условие конца

файла */

while (!eof(fh))

{ count = read(fh, buf, 10);

.

.

.

}.

EXECL - EXECVPE

#include <process.h> требуется только для

объявления функций

int execl(pathname, arg0, arg1 ... ,argn, NULL);

int execle(pathname, arg0, arg1 ... ,argn, NULL, envp);

int execlp(pathname, arg0, arg1 ... ,argn, NULL);

int execlpe(pathname, arg0, arg1 ... ,argn, NULL, envp);

int execv(pathname, argv);

int execve(pathname, argv, envp);

int execvp(pathname, argv);

int exevpe(pathname, argv, envp);

char *pathname; path-имя выполняемого

файла

char *arg0, *arg1, ..., *argn; список указателей на

аргументы

char *argv[]; массив указателей на

аргументы

char *envp[]; массив указателей на

установленное окруже-

ние

Описание.

Функции exec загружают и выполняют новый child-процесс.

Когда вызов произошел успешно, child-процесс размещается в памя-

ти, занятой вызвавшим процессом. Для загрузки и выполнения

child-процесса должно быть доступно достаточно памяти.

Pathname может определять полный path (из корня), часть

path (из текущего рабочего директория) или просто имя файла.

Если pathname не имеет расширения для имени файла или если

оно не заканчивается точкой (.), тогда функции exec устанавливают

расширение .EXE. Если pathname имеет расширение, то используется

только это расширение. Если pathname заканчивается точкой, exec

осуществляет поиск pathname без расширения. Процедуры execlp,

execlpe, execvpe осуществляют поиск для pathname (используя те же

самые процедуры) в директориях, определенных переменной окружения

PATH.

Аргументы для нового процесса передаются как аргументы в

вызове exec путем задания одного или более указателей на символь-

ные строки. Эти символьные строки образуют список аргументов для

child-процесса. Общая длина строк, определяющая список аргументов

для нового процесса, не может превышать 128 байтов. Нулевой сим-

вол окончания '\0 'для каждой строки в эту длину не засчитывает-

ся,а символы пробела (автоматически вставляемые для аргументов) -

засчитываются.

Указатели аргументов могут передаваться как отдельные аргу-

менты (в execl, execle, execlp, execlpe) или как массив указате-

лей (в execv, execve, execvp, execvpe). По крайней мере один ар-

гумент - arg0 или argv[0] - должен быть передан child-процессу.

По соглашению этот аргумент является копией аргумента pathname.

(Другое значение не будет воспринято как ошибка). В версиях MS

DOS, ранних от 3.0, передаваемое значение arg0 или argv[0] явля-

ется не доступным для использования в child-процессе. Однако, для

версий MS DOS 3.0 и старших pathname доступно как arg0 или

argv[0].

Вызовы execl, execle, execlp, execlpe обычно используются

тогда, когда количество аргументов известно заранее. Аргумент

arg0 обычно является указателем на pathname. Аргументы от arg1 до

argn указывают на символьные строки, образующие новый список ар-

гументов. Идущий за аргументом argn NULL-указатель определяет ко-

нец списка аргументов.

Обычно вызовы execv, execve, execvp, execvpe используются

тогда, когда число аргументов для нового процесса является пере-

менным. Указатели на аргументы пересылаются как массив argv. Ар-

гумент argv[0] обычно является указателем на pathname. Аргументы

от argv[1] до argv[n] указывают на символьные строки, образующие

новый список аргументов. Аргумент argv[n+1] должен быть NULL-ука-

зателем для определения конца списка аргументов.

Файлы, открытые до вызова exec, остаются открытыми и в но-

вом процессе. В вызовах execl, execlp, execv, execvp child-про-

цесс наследует окружение parent-процесса. Вызовы execle, execlpe,

execve, execvpe позволяют пользователю изменять окружение для

child-процесса, передавая список установленного окружения через

аргумент envp.

Аргумент envp является массивом указателей на char, каждый

элемент которого (исключая последний элемент) указывает на стро-

ку, которая заканчивается нулем и определяет переменную окруже-

ния. Обычно эта строка имеет форму:

NAME = value ,

где NAME - имя переменной окружения, value - значение стро-

ки (заметим, что value не заключается в кавычки "..."). Послед-

ним элементом массива envp должен быть NULL.

Если значением envp является NULL, child-процесс наследует

установленное окружение parent-процесса.

Возвращаемое значение.

Функции exec не имеют нормального возврата в вызывающий

процесс. Если из функции exec происходит возврат, то это означает

ошибку и возвращаемое значение равно -1. Переменная errno при

этом устанавливается в одно из следующих значений:

ЗНАЧЕНИЕ СМЫСЛ ЗНАЧЕНИЯ

E2BIG Список аргументов превышает 128 байт,

или пространство, требуемое для

информации окружения, превышает 32К

EACCES Блокировка или разделение файла (для

версий 3.0 и старших)

EMFILE Много открытых файлов (специфицирован-

ный файл должен быть открыт, чтобы

начать его выполнение)

ENOENT Файл или path-имя не найдено

ENOEXEC Заданный файл не является выполняемым

или имеет неверный формат

ENOMEM Доступной памяти не достаточно для

выполнения child-процеса; или доступная

память является запорченной; или

существуют неверные блоки, указывающие,

что parent-процесс неверно размещен

См. также abort, exit, _exit, onexit, spawnl, spawnle,

spawnlp, spawnlpe, spawnv, spawnve, spawnvp, spawnvpe, system.

Замечание. Вызовы exec не сохраняют текстовый режим преоб-

разования для открытых файлов. Если child-процесс должен исполь-

зовать файлы, унаследованные от parent-процесса, тогда должна

быть использована процедура setmode для установки требуемого ре-

жима преобразования для этих файлов.

Установки сигналов прерывания не сохраняются в child-про-

цессе, созданном вызовом процедуры exec. Эти установки переуста-

навливаются по умолчанию в child-процессе.

Пример:

#include <process.h>

#include <stdio.h>

extern char **environ;

char *args[4];

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]