CodeNet / Языки программирования / C / C++ / Linux/Unix / Справочник С/C++ для UNIX - Список функций
CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник С/C++ для UNIX - Список функций
CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник С/C++ для UNIX - Список функций
execl - execvpe
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]; int result; args[0] = "child"; args[1] = "one"; args[2] = "two"; args[3] = NULL; /* все следующие операторы позволяют выполнять процесс, названный "child.exe", и передать ему три аргумента. */ result = execl("child.exe", "child", "one", "two", NULL); result = execle("child.exe", "child", "one", "two", NULL, environ); result = execlp("child.exe", "child", "one", "two", NULL); result = execv("child.exe", args); result = execve("child.exe", args, environ); result = execvp("child.exe", args);. EXIT - _EXIT #include <process.h> требуется только для объявления функции #include <stdlib.h> использует либо <process.h>, либо <stdlib.h> void exit(status); завершает процесс после закры- тия файла void _exit(status); завершает процесс без обновле- ния буферов потока int status; статус выхода Описание. Функции exit и _exit завершают вызванный процесс. Перед за- вершением процесса функция exit обновляет все буферы и закрывает все открытые файлы. Функция _exit завершает все процессы без об- новления буферов потока. Значение status обычно устанавливается в 0 для указания нормального выхода и устанавливается в любое дру- гое значение для определения ошибки. Поскольку вызовы exit и _exit не возвращают значения, младший байт status является возв- ратом для ожидающего parent-процесса. Если нет parent-процесса, то значение status теряется. Возвращаемое значение. Возвращаемого значения нет. См.также abort, execl, execle, execlp, execv, execve, execvp, onexit, spawnl, spawnle, spawnlp, spawnv, spawnve, spawnvp, system. Пример: #include <process.h> #include <stdio.h> FILE *stream; . . . /* следующие операторы вызывают завершение процесса после обновления буферов и закрытия открытых файлов */ if((stream=fopen("data","r"))==NULL) { fprintf(stderr,"couldn't open data file\n"); exit (1); } /* следующие операторы вызывают немедленное завершение про- цесса, если файл не может быть открытым */ if((stream=fopen("data","r"))==NULL) { fprintf(stderr,"couldn't open data file\n"); _exit (1); }