Функции execv ()
Функции execv(), execve() и execvp() передают аргументы командной строки в векторе указателей на строки с завершающим нулевым символом. Количество аргументов командной строки должно быть известно во время компиляции. Элемент argv[0] обычно представляет собой команду.
• int execv(const char *path,char *const arg[]);
Здесь path — путевое имя выполняемой программы. Его можно задать в виде полного составного имени либо относительного составного имени из текущего каталога. Последующий параметр представляет вектор (с завершающим нулевым символом), содержащий аргументы командной строки, представленные в виде строк с завершающими нулевыми символами. Всего может быть n аргументов. Этот вектор завершается NULL-указателем. Элементу arg[] можно присвоить значение таким образом:
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(), сами устанавливают среду.