Параллельное и распределенное программирование на С++
Шрифт:
• int execle(const char *path,const char *arg0,.../*,(char *)0 *, char *const envp[]*/);
Эта функция аналогична функции execl с одним отличием: она имеет дополнительный параметр, envp[]. Этот параметр указывает на новую среду для нового процесса, т.е. envp[] — это указатель на строковый массив с завершающим нулевым символом. Каждая его строка, также завершающаяся нулевым символом, имеет следующую форму:
name=value
Здесь name — имя переменной среды, а value — сохраняемая строка. Значение параметру envp [] можно присвоить следующим образом:
char *const envp[] = {«PATH=/opt/kde2:/sbin»,
Здесь PATH и НОМЕ — переменные среды.
• int execlp(const char *file,const char *arg0,.../*, (char *)0 */);
Здесь file — имя выполняемой программы. Для определения местоположения выполняемых программ используется переменная среды PATH. Остальные параметры представляют собой список аргументов командной строки (см. описание функции execl ) .
Вот примеры применения синтаксиса функций execl с различными аргументами:
char *const args[] = {«direct»,".»,NULL};
char *const envp[] = {«files=50»,NULL};
execl("/path/direct», «direct», ".», NULL) ;
execle("/path/direct»,«direct»,".»,NULL,envp);
execlp(«direct», «direct», " . ",NULL) ;
Здесь в каждом примере вызова execl– функции активизированный процесс выполняет программу direct.
Синопсис
#include <unistd.h>
int execl(const char *path,const char *arg0,.../*,(char *)0 */);
int execle(const char *path,const char *arg0,.../*,(char *)0 *,char *const envp[]*/);
int execlp(const char *file,const char *arg0,.../*,(char *)0 */);
int execv(const char *path,char *const arg[]);
int execve(const char *path,char *const arg[],char *const envp[]); int execvp(const char *file,char *const arg[]);
Функции 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 <unistd.h>
long sysconf(int name);
Еще одним ограничением при использовании функций семейства exec и других Функций, применяемых для создания процессов, является максимальное количество одновременно выполняемых процессов, которое допустимо для одного пользователя.
Чтобы функция sysconf возвратила это число, ее параметру name необходимо присвоить значение _SC_CHILD_MAX.
Чтение и установка переменных среды
Переменные среды представляют собой строки с завершающими нулевыми символами, в которых хранится такая системная информация, как пути к каталогам, содержащим команды, библиотеки, функции и процедуры, используемые процессом. Их также можно использовать для передачи любых определенных пользователем данных между родительскими и сыновними процессами. Они обеспечивают механизм предоставления процессу специальной информации без необходимости жесткого ее связывания с кодом программы. Переменные среды предопределены системой и совместно используются всеми ее оболочками и процессами. Эти переменные инициализируются файлами запуска. Чаще всего используются следующие системные переменные.
$НОМЕ Полное составное имя каталога пользователя.
$РАТН Список каталогов для поиска выполняемых файлов при выполнении команд.
$MAIL Полное составное имя почтового ящика пользователя.
$USER Идентификатор (id) пользователя.
$SHELL Полное составное имя командной оболочки зарегистрированного пользователя.
$TERM Тип терминала пользователя.
Переменные среды могут храниться в файле или в списке, принадлежащем среде. Этот список среды содержит указатели на строки с завершающими нулевыми символами. Когда процесс начинает выполняться, переменная extern char **environ