Spawn в вычислениях относится к функции, которая загружает и выполняет новый дочерний процесс . Текущий процесс может ожидать завершения дочернего процесса или продолжать выполнять параллельные вычисления . Создание нового подпроцесса требует достаточно памяти, в которой могут выполняться как дочерний процесс, так и текущая программа.
В DOS существует семейство функций spawn , унаследованное Microsoft Windows .
Существует также другое семейство функций создания в необязательном расширении стандартов POSIX . [1]
Функции spawn DOS/Windows вдохновлены функциями Unix fork и exec ; однако, поскольку эти операционные системы не поддерживают fork, [2] функция spawn была предоставлена в качестве замены для комбинации fork-exec. Однако, функция spawn, хотя и адекватно справляется с наиболее распространенными вариантами использования, не обладает всей мощью fork-exec, поскольку после fork любые настройки процесса, которые выживут после exec, могут быть изменены. Однако в большинстве случаев этот недостаток можно компенсировать, используя API CreateProcess более низкого уровня.
В вызовах spawnl , spawnlp , spawnv и spawnvp дочерний процесс наследует среду родителя. Файлы, которые открыты при вызове spawn, остаются открытыми в дочернем процессе.
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 , за которым следует одна или несколько букв:
Аргумент mode определяет способ запуска дочернего процесса. Значения для mode :
Аргумент path указывает имя файла программы для выполнения. Только для spawnlp и spawnvp , если имя файла не имеет пути и не находится в текущем каталоге, переменная среды PATH определяет, в каких каталогах искать файл. Строка, на которую указывает argv [0], является именем программы для выполнения.
Командная строка, переданная порожденной программе, состоит из строк символов, от arg0 до argn , в вызове порождения . Принятая максимальная объединенная длина этих строк различается в зависимости от компилятора и составляет от 128 символов в Digital Mars [3] до 1024 в Microsoft Visual C++ [4] или столько, сколько позволяет память в DJGPP. [5] Последний аргумент после argn должен быть указателем NULL.
Аргумент argv — это массив указателей символов. Последний указатель в массиве должен быть нулевым, чтобы указать конец списка.
Вызовы spawnle , spawnlpe , spawnve и spawnvpe позволяют пользователю изменять среду дочернего процесса, передавая список настроек среды в аргументе envp . Этот аргумент представляет собой массив указателей символов; каждый указатель (за исключением последнего) указывает на строку с нулевым окончанием , определяющую переменную среды. Переменная среды имеет вид:
имя = значение
где name — имя переменной, а value — ее значение. Последний указатель в массиве — null. Если аргумент envp равен null, дочерний элемент наследует настройки среды родителя.
В Microsoft Windows функции spawn* используют LoadModule для запуска порожденного процесса; и если это не удается, делается попытка породить обычный процесс MS-DOS. Если порождается приложение Windows, дескриптор экземпляра можно получить с помощью exec_instancehandleget . Можно указать, как будет отображаться порожденная программа, с помощью функций _exec_showset , _exec_showget и _exec_showreset .
Возвращаемое значение указывает на статус завершения порожденной программы. Значение, равное нулю, указывает на то, что порожденная программа была выполнена успешно. Положительное значение указывает на то, что порожденная программа была выполнена, но была прервана или завершилась с ошибкой, возвращаемое значение является статусом завершения дочернего процесса. Отрицательное значение указывает на то, что порожденная программа не была выполнена, и устанавливается errno. В Microsoft Windows spawn возвращает отрицательный код ошибки, возвращенный LoadModule для совместимости с библиотекой времени выполнения C. Могут встречаться следующие коды ошибок:
И posix_spawnp
может использоваться в качестве замены fork и exec , но не обеспечивает той же гибкости, что и использование fork
и exec
по отдельности. Они могут быть эффективными заменами для fork
и exec
, но их цель — предоставить примитивы создания процессов во встроенных средах, где fork
не поддерживается из-за отсутствия динамической трансляции адресов .
Метафора spawn , т. е. производить потомство, как в отложении яиц, имела свое раннее применение в операционной системе VMS, теперь OpenVMS (1977). В академических кругах существовали оживленные дебаты между сторонниками форка Unix ( грубая копия структуры памяти, но быстрая) и spawn VMS (надежная конструкция параметров процесса, но медленнее). Эти дебаты возродились, когда механизм spawning VMS был унаследован Windows NT (1993).