char *const arg[] = {«traverse»,".», ">",«1000»,NULL};
Вот пример вызова этой функции:
execv(«traverse», arg) ;
В этом случае утилита traverse перечислит все файлы в текущем каталоге, размер которых превышает 1000 байт.
• int execve(const char *path,char *const arg[],char *const envp[]);
Эта функция аналогична функции execv(), с одним отличием: она имеет дополнительный параметр, envp[], который описан выше.
• int execvp(const char *file,char *const arg[]);
Здесь file —имя выполняемой программы. Последующий параметр представляет собой вектор (с завершающим нулевым символом), содержащий аргументы командной строки, представленные в виде строк с завершающими нулевыми символами. Всего может быть n аргументов. Этот вектор завершается NULL-указателем.
Вот примеры применения синтаксиса функций execv () с различными аргументами:
char *const arg[] = {«traverse»,".», ">",«1000»,NULL};
char *const envp[] = {«files=50»,NULL};
execv("/path/traverse», arg);
execve("/path/traverse», arg, envp);
execvp(«traverse», arg);
Здесь в каждом примере вызова execv-функции активизированный процесс выполняет программу traverse.
Определение ограничений для функций exec ()
Существуют ограничения на размеры вектора argv[] и массива envp[], передаваемые функциям семейства exec. Для определения максимального размера аргументов командной строки и размера переменных среды при использовании exec-функций (которые принимают параметр envp [ ]) можно использовать функцию sysconf (). Чтобы эта функция возвратила размер, ее параметру name необходимо присвоить значение _SC_ARG_МАХ.
Синопсис
#include
long sysconf(int name);
Еще одним ограничением при использовании функций семейства exec и других Функций, применяемых для создания процессов, является максимальное количество одновременно выполняемых процессов, которое допустимо для одного пользователя.
Чтобы функция sysconf() возвратила это число, ее параметру name необходимо присвоить значение _SC_CHILD_MAX.
Чтение и установка переменных среды
Переменные среды представляют собой строки с завершающими нулевыми символами, в которых хранится такая системная информация, как пути к каталогам, содержащим команды, библиотеки, функции и процедуры, используемые процессом. Их также можно использовать для передачи любых определенных пользователем данных между родительскими и сыновними процессами. Они обеспечивают механизм предоставления процессу специальной информации без необходимости жесткого ее связывания с кодом программы. Переменные среды предопределены системой и совместно используются всеми ее оболочками и процессами. Эти переменные инициализируются файлами запуска. Чаще всего используются следующие системные переменные.
$НОМЕПолное составное имя каталога пользователя.
$РАТНСписок каталогов для поиска выполняемых файлов при выполнении команд.
$MAILПолное составное имя почтового ящика пользователя.
$USERИдентификатор (id) пользователя.
$SHELLПолное составное имя командной оболочки зарегистрированного пользователя.
$TERMТип терминала пользователя.
Переменные среды могут храниться в файле или в списке, принадлежащем среде. Этот список среды содержит указатели на строки с завершающими нулевыми символами. Когда процесс начинает выполняться, переменная extern char **environ
будет указывать на список среды. Строки, составляющие список среды, имеют следующий формат: name=value
Процессы, инициализированные с помощью функций execl(), execlp(), execv() и execvp(), наследуют конфигурацию среды родительского процесса. Процессы, инициализированные с помощью функций execve() и execle(), сами устанавливают среду.
Существуют функции и утилиты, которые позволяют опросить, добавить или модифицировать переменные среды. Функция getenv() используется для определения факта установки заданной переменной. Интересующая вас переменная задается с помощью параметра name. Если заданная переменная не установлена, функция возвращает значение NULL.В противном случае (если переменная установлена), функция возвращает указатель на строку, содержащую ее значение.
Синопсис
#include
char *getenv(const char *name);
int setenv(const char *name, const char *value,
int overwrite); void unsetenv(const char *name);
Рассмотрим пример:
string Path; Path = getenv(«PATH»);
Здесь строке Path присваивается значение, содержащееся во встроенной переменной среды РАТН.
функция setenv() используется для изменения значения существующей переменной среды или добавления новой переменной в среду вызывающего процесса. Параметр name содержит имя переменной среды, которую надлежит добавить или изменить. Заданной переменной присваивается значение, переданное в параметре value. Если переменная, заданная параметром name, уже существует, ее прежнее значение заменяется значением, заданным параметром value при условии, если параметр overwrite содержит ненулевое значение. Если же значение overwrite равно 0, содержимое заданной переменной среды не модифицируется. Функция setenv () возвращает 0 при успешном выполнении, в противном случае — значение -1. функция unsetenv () удаляет переменную среды, заданную параметром name.
Читать дальше