Читать книгу 📗 "QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович"
Ознакомительный фрагментявляются POSIX-совместимыми, а большая часть форм функции представляет собой специфическое расширение QNX. Более того, даже для тех функций группы , которые часто называют POSIX-совместимыми [1], техническая документация QNX определяет степень совместимости примерно в таких терминах: « …функция spawn() является функцией QNX Neutrino (основанной на POSIX 1003.1d черновом стандарте).», напротив, подменяют исполняемый код текущего процесса (не изменяя его идентификатор PID, права доступа, внешние ресурсы процесса, а также находящийся в том же адресном пространстве) исполняемым кодом из другого файла. Поэтому используются эти вызовы непосредственно после для замены копии вызывающего процесса новым (это классическая UNIX-технология использования)., напротив, порождают новый процесс (с новым идентификатором PID и в новом адресном пространстве). Все формы вызовов spawn() после подготовительной работы (иногда очень значительной) в конечном итоге ретранслируются в вызов базовой формы [13], который последним действием своего выполнения и посылает сообщение (менеджер процессов QNX, «территориально» объединенный с микроядром системы в одном файле).определяется следующим образом: — полное имя исполняемого бинарного файла;— размерность следующего за ним массива ;— массив файловых дескрипторов, которые вы хотели бы унаследовать в дочернем процессе от родительского. Если не равен 0 (то есть может иметь значения вплоть до константы ), то должен содержать список из файловых дескрипторов. Если же равен 0, то дочерний процесс наследует все родительские дескрипторы, исключая те, которые созданы с флагом функции ;— системная структура (см. системные определения) типа , содержащая как минимум:— один или более установленных бит:— позволить запускать требуемый командный интерпретатор, интерпретируя как скрипт (интерпретатор указан в первой строке скрипта );— использовать переменную окружения для поиска выполняемого файла ;— установить для дочернего процесса значение группы, специфицируемое членом (структуры) . Если этот флаг не установлен, дочерний процесс будет частью текущей группы родительского процесса;— запустить дочерний процесс на удаленном сетевом узле QNET, сам же удаленный узел специфицируется членом (структуры) (см. команду удаленного запуска );— использовать структуру для определения процесса множества (набора) сигналов, для которых будет установлена реакция по умолчанию. Если этот флаг не установлен, дочерний процесс наследует все сигнальные реакции родителя;— использовать в качестве сигнальной маски дочернего процесса.— группа дочернего процесса; имеет смысл, только если установлен флаг . Если флаг установлен и установлен как , то дочерний процесс открывает новую группу процессов с идентификатором группы (GID), равным PID этого нового процесса.— сигнальная маска дочернего процесса, если установлен флаг .— набор сигналов дочернего процесса, для которых определяется реакция по умолчанию, если установлен флаг .— это совершенно уникальный (относительно других ОС, а значит, и всего POSIX) параметр QNX - дескриптор узла сети QNET, на котором должен быть запущен новый процесс. Это поле используется, только если установлен флаг .— указатель массива аргументов. Значение должно быть строкой ( ), содержащей имя файла, загружаемого как процесс (но может быть , если аргументы не передаются). Последний элемент массива обязан быть . Само значение никогда не может быть .— указатель массива символьных строк переменных системного окружения (environment). Последний элемент массива обязан быть . Каждый элемент массива является строкой ( ) вида: variable = value. Если само значение указателя равно , то дочерний процесс полностью наследует копию окружения родителя. (Окружение процесса — всегда «копия», поэтому любые изменения, внесенные в окружение дочерним процессом, никак не отражаются на окружении его родителя.) ), то первая строка текста скрипта должна начинаться с , за которыми должны следовать путь и аргументы того интерпретатора, который будет использоваться для интерпретации этого скрипта. К скрипту не применяется установленный в системе интерпретатор по умолчанию (как это происходит при вызове его по имени из командной строки).
Большинство форм функции
exec()spawn()spawn()Функции семейства
exec()fork()Функции семейства
spawn()spawn()procntoБазовый вызов
spawn()
#include <spawn.h>
pid_t spawn(const char* path, int fd_count, const int fd_map[],
const struct inheritance* inherit, char* const argv[],
char* const envp[]);где
path
fd_countfd_map
fd_mapfd_countOPEN_MAXfd_mapfd_countfd_countPD_CLOEXECfcntl()
inheritstruct inheritance
unsigned long flags
SPAWN_CHECK_SCRIPTspawn()pathpath
SPAWN_SEARCH_PATHPATHpath
SPAWN_SETGROUPpgroup
SPAWN_SETNDndon
SPAWN_SETSIGDEFsigdefault
SPAWN_SETSIGMASKsigmask
pid_t pgroupSPAWN_SETGROUPSPAWN_SETGROUPinherit.pgroupSPAWN_NEWPGROUP
sigset_t sigmaskSPAWN_SETSIGMASK
sigset_t sigdefaultSPAWN_SETSIGDEF
uint32_t ndSPAWN_SETND
argvargv[0]char*NULLargvNULLargvNULL
envpenvpNULLchar*envpNULLПримечание
Если дочерний процесс является скриптом интерпретатора (флаг
SPAWN_CHECK_SCRIPT#!