Спаун (вычисления)
Spawn в вычислительной технике означает функцию, которая загружает и выполняет новый дочерний процесс .Текущий процесс может дождаться завершения дочернего процесса или может продолжить выполнение параллельных вычислений . Для создания нового подпроцесса требуется достаточно памяти, в которой могут выполняться как дочерний процесс, так и текущая программа.
существует семейство функций создания В DOS , унаследованных Microsoft Windows .
Существует также другое семейство функций создания в дополнительном расширении POSIX. стандартов . [1]
Функции запуска DOS/Windows
[ редактировать ]Функции создания DOS/Windows вдохновлены Unix функциями fork и exec ; однако, поскольку эти операционные системы не поддерживают форк, [2] функция spawn была предоставлена в качестве замены комбинации fork-exec. Однако функция spawn, хотя и адекватно справляется с наиболее распространенными случаями использования, не обладает всей мощью fork-exec, поскольку после fork любые настройки процесса, которые выдержат выполнение, могут быть изменены. Однако в большинстве случаев этот недостаток можно восполнить, используя более низкоуровневый 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*. |
П_WAIT | Приостанавливает родительский процесс до тех пор, пока дочерний процесс не завершит выполнение (синхронный запуск). |
P_NOWAIT, P_NOWAITO | Продолжает выполнять вызывающий процесс одновременно с новым процессом (асинхронное создание). |
P_DETACH | ребенок запускается в фоновом режиме без доступа к консоли или клавиатуре. Вызовы _cwait при новом процессе завершится неудачей (асинхронное создание) |
Путь
[ редактировать ]Аргумент пути указывает имя файла программы, которую нужно выполнить. Только для spawnlp и spawnvp , если имя файла не имеет пути и не находится в текущем каталоге, переменная среды PATH определяет, в каких каталогах искать файл. Строка, на которую указывает argv [0], является именем запускаемой программы.
Командная строка, передаваемая в порожденную программу, состоит из строк символов от arg0 до argn в вызове spawn . Принятая максимальная общая длина этих строк различается в зависимости от компилятора и варьируется от 128 символов на Digital Mars. [3] до 1024 в Microsoft Visual C++ [4] илинасколько позволяет память, на DJGPP. [5] Последний аргумент после argn должен быть NULL-указателем.
аргв
[ редактировать ]Аргумент argv представляет собой массив указателей на символы. Последний указатель в массиве должен быть нулевым, чтобы указать конец списка.
конверт
[ редактировать ]Вызовы spawnle spawnve , spawnlpe , аргументе и spawnvpe позволяют пользователю изменять среду дочернего процесса, передавая список настроек среды в envp . Этот аргумент представляет собой массив указателей на символы; каждый указатель (кроме последнего) указывает на строку с нулевым завершением, определяющую переменную среды. Переменная среды имеет вид:
name=value
где name — это имя переменной, а value — ее значение. Последний указатель в массиве равен нулю. Если аргумент envp равен нулю, дочерний элемент наследует настройки среды родительского элемента.
В 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 | Приложение ДОС 4.0 |
-14 | Неизвестный тип .exe (возможно, расширение DOS) |
Функции появления POSIX
[ редактировать ]The posix_spawnp
может использоваться в качестве замены fork и exec , но не обеспечивает такой же гибкости, как использование fork
и exec
отдельно. Они могут стать эффективной заменой fork
и exec
, но их цель — предоставить примитивы создания процессов во встроенных средах, где fork
не поддерживается из-за отсутствия динамической трансляции адресов .
История
[ редактировать ]Метафора нереста , то есть производства потомства, как при откладывании яиц, рано использовалась в операционной системе VMS, ныне OpenVMS (1977). В академических кругах шли оживленные дебаты между сторонниками Unix форка VMS (грубая копия структуры памяти, но быстрая) и порождения (надежное построение параметров процесса, но более медленное). Эти дебаты возобновились, когда механизм создания VMS был унаследован Windows NT (1993).
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Posix.1-2008 spawn.h
- ^ Подсистема Windows для Linux реализует форк. Другие среды POSIX, такие как Cygwin , могут иметь реализацию, но ее использование не рекомендуется из-за различий в модели процесса между POSIX и Windows. Fork не является частью Windows API , и большинство программ Windows не используют эти среды, поэтому у них нет доступа к fork.
- ^ Цифровой процесс Марса.h
- ^ Microsoft MSDN
- ^ Спаун DJGPP *