Параллельное и распределенное программирование на С++
Шрифт:
3.6.4. Использование функции system для порождения процессов
Функция system используется для выполнения команды или запуска программы. Функция system выполняет функцию fork, а затем сыновний процесс вызывает функцию exec с оболочкой, выполняя заданную команду или программу.
Синопсис
#include <stdlib.h>
int system(const char *string);
В качестве параметра string можно передать системную команду или имя выполняемого файла. При удачном исходе функция возвращает статус завершения команды или значение, возвращаемое программой (если
Функция system возвращает значение родительскому процессу. При неудачном исходе функции exec возвращается число 127, а при обнаружении других ошибок — число -1. Эта функция не влияет на состояние ожидания сыновних процессов.
Использование POSIX-функций для порождения процессов
Подобно созданию процессов с помощью функций system и fork-exec, функции posix_spawn создают новые сыновние процессы из заданных образов процессов. Однако функции posix_spawn позволяют при этом реализовать более многослойные «рычаги» управления, т.е. они управляют следующими атрибутами сын овних процессов, унаследованных от родительского процесса:
• Дескрипторы файлов;
• стратегия планирования;
• идентификатор группы процессов;
• идентификатор пользователя и группы;
• маска сигналов.
Функции posix_spawn позволяют управлять тем, будут ли сигналы, проигнорированные родительским процессом, игнорироваться его потомком или устанавливаться для выполнения действий, заданных по умолчанию. Управление дескрипторами файлов позволяет сыновнему процессу получить самостоятельный доступ к потоку данных, независимо открытому родителем. Возможность установить для сыновнего процесса идентификатор группы повлияет на то, как управление сыновней задачей будет связано с управлением родителем. Наконец, стратегию планирования сыновнего процесса можно установить отличной от стратегии планирования его родителя.
Синопсис
#include <spawn.h>
int posix_spawn( pid_t *restrict pid, const char *restrict path,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *restrict attrp,
char *const argv[restrict],
char *const envp[restrict]);
int posix_spawnp(pid_t *restrict pid, const char *restrict file,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *restrict attrp,
char *const argv[restrict],
char *const envp[restrict]);
Различие между этими двумя функциями состоит в том, что функции posix_spawn передается параметр path, а функции posix_spawnp — параметр file. Параметр path в функции posix_spawn принимает полное или относительное составное имя выполняемого файла, а параметр file в функции posix_spawnp — только имя выполняемой программы. Если этот параметр содержит символ «косая черта», то содержимое параметра file используется в качестве составного путевого имени. В противном случае путь к выполняемому файлу определяется с помощью переменной среды PATH .
Параметр file_actions представляет собой указатель на структуру posix_spawn_file_actions_t:
struct posix_spawn_file_actions_t {
int _allocated;
int _used;
struct _spawn_action *actions;
int _pad[16] ;
} ;
Структура posix_spawn_file_actions_t
Таблица З.4. Функции, используемые для добавления действий над файлами в объект типа posix_spawn_file_actions
int posix_spawn_file_actions_addclоse (posix_spawn_file_actions_t *file_actions, int fildes);
Добавляет действие close в объект действий над файлами, заданный параметром file_actions. В результате при порождении нового процесса с помощью этого объекта будет закрыт файловый дескриптор fildes
int posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *file_actions, int fildes,
const char *restrict path, int oflag, mode_t mode);
Добавляет действие open в объект действий над файлами, заданный параметром file_actions. В результате при порождении нового процесса с помощью этого объекта будет открыт файл, заданный параметром path, с использованием дескриптора fildes
int posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *file_actions, int fildes, int new fildes);
Добавляет действие dup2 в объект действий над файлами, заданный параметром file_actions. В результате при порождении нового процесса с помощью этого объекта будет создан дубликат файлового дескриптора fildes с использованием файлового дескриптора newfildes
int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t *file_actions);
Разрушает объект, заданный параметром file_actions, что приводит к деинициализации этого объекта. Затем его можно инициализировать повторно с помощью функции posix_spawn_file_actions_init
int posix_spawn_file_actions_init (posix_spawn_file_actions_t *file_actions);
Инициализирует объект, заданный параметром file_actions. После инициализации этот объект не будет содержать действий, предназначенных для выполнения над файлами
Параметр attrp указывает на структуру posix_ spawnattr_t:
struct posix_spawnattr_t {
short int _flags;
pid_t _pgrp;
sigset__t _sd;
sigset_t _ss;
struct sched_param _sp;
int _policy;
int _pad[16] ;
};
Эта структура содержит информацию о стратегии планирования, группе процессов, сигналах и флагах для нового процесса. Ниже следует описание отдельных атрибутов этой структуры.