Параллельное и распределенное программирование на С++
Шрифт:
|-syslogd
|-usbmgr
'-xconsole
Ри с . 3.10. Результат выполнения команды pstree -h в среде Linux
Использование системной функции fork
Системная функция (или системный вызов) fork создает новый процесс, который представляет собой дубликат вызывающего процесса, т.е. его родителя. При успешном выполнении функция fork
Синопсис
#include <unistd.h>
pid_t fork(void); _
Неудачный исход функции fork возможен в случае, если система не обладает ресурсами для создания еще одного процесса. Это происходит при превышении ограничения (если оно существует) на количество сыновних процессов, которое может порождать родитель, или на количество выполняющихся процессов в масштабе всей системы. В этом случае устанавливается переменная errno, которая означает наличие ошибки.
Использование семейства системных функций exec
Семейство функций exec предназначено для замены образа вызывающего процесса образом нового процесса. При вызове функции fork создается новый процесс, который является точной копией родительского процесса, а функция exec заменяет образ «скопированного» процесса образом копии. Образ нового процесса представляет собой обычный выполняемый файл, который немедленно запускается на выполнение. Этот файл можно задать с помощью имени и пути доступа к нему. Функции семейства exec могут передать новому процессу аргументы командной строки, а также установить переменные среды. Если функция выполнилась успешно, она не возвращает никакого значения, поскольку образ процесса, который содержал обращение к функции exec, уже перезаписан. В случае неудачи вызывающему процессу возвращается число -1. Все функции exec могут иметь неудачный исход при следующих условиях:
• разрешения не признаны; разрешение на поиск отвергается для каталога выполняемых файлов; разрешение на выполнение отвергается для выполняемого файла;
• файлы не существуют, выполняемый файл не существует; каталог не существует;
• файл невозможно выполнить; файл невозможно выполнить, поскольку он открыт для записи другим процессом; файл не является выполняемым;
пр облемы с символическими ссылками; при анализе пути к исполняемому файлу символические ссылки образуют циклы; символические ссылки делают путь к исполняемому файлу слишком длинным.
Функции семейства exec используются совместно с функцией fork . Функция fork создает и инициализирует сыновний процесс «по образу и подобию» родительского. Образ сыновнего процесса затем заменяет образ своего предка посредством вызова
//Лис тинг 3.2. Использование системных функций fork и exec
RtValue = fork;
if(RtValue == 0){
execl("/path/direct»,«direct»,".»);
}
В листинге 3.2 демонстрируется вызов функции fork. Значение, которое она возвращает, сохраняется в переменной RtValue. Если значение RtValue равно 0, значит, это — сыновний процесс, и в нем вызывается функция execl с параметрами. Первый параметр содержит путь к выполняемому модулю, второй — инструкцию для выполнения, а третий — аргумент. Второй параметр, direct, представляет собой имя утилиты, которая перечисляет все каталоги и подкаталоги из данного каталога. Всего существует шесть версий функций exec, предназначенных для использования различных соглашений о вызовах.
Функции execl
Функции execl , execle и execlp передают аргументы командной строки в виде списка. Количество аргументов командной строки должно быть известно во время компиляции.
• int execl(const char *path,const char *arg0,.../*,(char * )0 */);
Здесь path — путевое имя выполняемой программы. Его можно задать в виде полного составного имени либо относительного составного имени из текущего каталога. Последующие параметры представляют собой список аргументов командной строки, от arg0 до argn. Всего может быть n аргументов. Этот список завершается NULL– указателем.
• 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», «HOME=/home»,NULL};
Здесь 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.
Синопсис