Спаун (вычисление) - Spawn (computing)

Порождение в вычислениях относится к функции, которая загружает и выполняет новый дочерний процесс . Текущий процесс может ждать ребенка прекратить или может продолжать выполнять параллельное вычисление . Для создания нового подпроцесса требуется достаточно памяти, в которой могут выполняться как дочерний процесс, так и текущая программа.

В DOS есть семейство функций порождения , унаследованных от Microsoft Windows .

Существует также другое семейство функций порождения в дополнительном расширении стандартов POSIX .

Функции появления DOS / Windows

Функции порождения DOS / Windows вдохновлены функциями fork и exec Unix ; однако, поскольку эти операционные системы не поддерживают fork, функция spawn была предоставлена ​​в качестве замены комбинации fork-exec. Тем не менее, функция spawn, хотя она адекватно справляется с наиболее распространенными случаями использования, не обладает полной мощностью fork-exec, поскольку после fork любые настройки процесса, которые переживут exec, могут быть изменены. Однако в большинстве случаев этот недостаток можно восполнить с помощью более низкоуровневого API CreateProcess.

В вызовах spawnl , spawnlp , spawnv и spawnvp дочерний процесс наследует среду родительского. Файлы, которые открыты , когда мицелий вызов сделан остаются открытыми в дочернем процессе.

Прототип

int spawnl(int mode, char *path, char *arg0, ...);
int spawnle(int mode, char *path, char *arg0, ..., char ** envp);
int spawnlp(int mode, char *path, char *arg0, ...);
int spawnlpe(int mode, char *path, char *arg0, ..., char ** envp);
int spawnv(int mode, char *path, char **argv);
int spawnve(int mode, char *path, char **argv, char ** envp);
int spawnvp(int mode, char *path, char **argv);
int spawnvpe(int mode, char *path, char **argv, char ** envp);

Имена функций

Базовое имя каждой функции - это spawn , за которым следуют одна или несколько букв:

Письмо Примечания
л Аргументы командной строки передаются функции индивидуально.
v Аргументы командной строки передаются функции в виде массива указателей.
п Использует переменную аргумента PATH, чтобы найти файл для выполнения.
е Массив указателей на аргументы среды явно передается дочернему процессу.

Режим

Режим аргумент определяет путь ребенка работать. Значения для режима :

Имя Примечания
P_OVERLAY Накладывает родительский процесс на дочерний, который уничтожает родительский процесс. Это имеет тот же эффект, что и функции exec *.
P_WAIT Приостанавливает родительский процесс до тех пор, пока дочерний процесс не завершит выполнение (синхронное порождение).
P_NOWAIT, P_NOWAITO Продолжает выполнять вызывающий процесс одновременно с новым процессом (асинхронный порождение).
P_DETACH ребенок работает в фоновом режиме без доступа к консоли или клавиатуре. Вызов _cwait после нового процесса завершится ошибкой (асинхронный порождение)

Дорожка

Путь аргумент задает имя файла программы для выполнения. Только для spawnlp и spawnvp , если имя файла не имеет пути и не находится в текущем каталоге, переменная среды PATH определяет, в каких каталогах искать файл. Строка, на которую указывает argv [0], - это имя запускаемой программы.

Командная строка, передаваемая в порожденную программу, состоит из символьных строк, от arg0 до argn , в вызове порождения . Допустимая максимальная суммарная длина этих строк различается в зависимости от компилятора: от 128 символов на Digital Mars до 1024 символов на Microsoft Visual C ++ или настолько, насколько позволяет память, на DJGPP. Последний аргумент после argn должен быть указателем NULL.

argv

ARGV аргумент является массивом символьных указателей. Последний указатель в массиве должен иметь значение NULL, чтобы указать конец списка.

envp

В spawnle , spawnlpe , spawnve и spawnvpe вызовы позволяют пользователю изменять окружение дочернего процесса, передавая список параметров среды в envp аргумента. Этот аргумент представляет собой массив символьных указателей; каждый указатель (кроме последнего) указывает на строку с завершающим нулем, определяющую переменную среды. Переменная окружения имеет вид:

name=value

где имя - это имя переменной, а значение - ее значение. Последний указатель в массиве нулевой. Когда аргумент envp имеет значение null, дочерний элемент наследует настройки родительской среды.

В Microsoft Windows функции spawn * используют LoadModule для запуска порожденного процесса; и если это не удается, делается попытка запустить нормальный процесс MS-DOS. Если создается приложение Windows, дескриптор экземпляра можно получить с помощью exec_instancehandleget . Можно указать, как будет отображаться созданная программа, с помощью функций _exec_showset , _exec_showget и _exec_showreset .

Возвращаемые значения

Возвращаемое значение указывает статус выхода созданной программы. Нулевое значение указывает на успешное выполнение созданной программы. Положительное значение указывает, что порожденная программа была выполнена, но была прервана или завершилась из-за ошибки, возвращаемое значение является статусом завершения дочернего процесса. Отрицательное значение указывает, что порожденная программа не была выполнена, и установлена ​​ошибка errno. В Microsoft Windows spawn возвращает инвертированный код ошибки, возвращаемый LoadModule для совместимости с библиотекой времени выполнения C. Могут встречаться следующие коды ошибок:

Стоимость Примечания
-2 Файл не найден
-3 Путь не найден
-11 Неверный файл .exe (для Windows)
-13 Приложение DOS 4.0
-14 Неизвестный тип .exe (возможно, расширен для DOS)

Функции создания POSIX

Операторы posix_spawn(3p)и его родственники posix_spawnpмогут использоваться в качестве замены для fork и exec , но не обеспечивают такой же гибкости, как использование forkи по execотдельности. Они могут быть эффективными заменами для forkи exec, но их цель - предоставить примитивы создания процессов во встроенных средах, которые forkне поддерживаются из-за отсутствия динамической трансляции адресов .

История

Икру метафора, то есть, чтобы произвести потомство , как и в откладывания яиц, было его раннее использование в VMS, теперь OpenVMS , операционная система (1977). В академических кругах велись оживленные дебаты между сторонниками Unix- форка (грубая копия схемы памяти, но быстро) и порождения VMS (надежное построение параметров процесса, но медленнее). Эта дискуссия возобновилась, когда механизм порождения VMS был унаследован Windows NT (1993).

Смотрите также

использованная литература