Создать процесс
#include <sys/spawn.h>/* If using C and gcc version 2.95, use: */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[],char *const envp[] );/* If using C++ and gcc higher than version 2.95, use: */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_arr],char *const envp[_Restrict_arr] );
NULL
, если аргументы не передаются. Последним элементом argv должен быть NULL
указатель. Сам указатель argv не может иметь значение NULL
.NULL
, то используются значения по умолчанию.NULL
указатель. Каждый указатель в массиве характеризует строку вида: NULL
, то дочерний процесс наследует окружение родительского процесса. libc
Функция posix_spawn() создает новый процесс (дочерний процесс) на основе указанного образа процесса. Новый образ создается из обычного исполняемого файла. Единственная разница между posix_spawn() и posix_spawnp() заключается в том, что последняя принимает имя исполняемого файла без указания полного пути к нему и производит его поиск.
Когда программа, написанная на языке C, выполняется в результате этого вызова, она получает управление в следующей функции:
int main( int argc, char *argv[] );
где argc — количество аргументов, а argv — массив указателей на сами аргументы.
Кроме того, следующая переменная: extern char
**environ; инициализируется как указатель на массив указателей на символьные строки, определяющие переменную среды. Аргумент argv представляет собой массив указателей на символы нуль-терминированных строк. Последний элемент этого массива является NULL
указателем и не учитывается в argc. Эти строки составляют список аргументов, доступных для нового образа процесса. Значение в argv[0] должно указывать на имя файла, связанное с образом процесса, запускаемого функцией posix_spawn() или posix_spawnp().
Аргумент envp представляет собой массив указателей на символы нуль-терминированных строк. Эти строки содержат переменные среды исполнения для нового образа процесса. Массив среды исполнения также завершается NULL
указателем. Общее количество байт, доступных для списков аргументов и сред дочернего процесса, составляет {ARG_MAX
}. Реализация должна быть определена в системной документации (см. том «Базовые определения» стандарта IEEE Std 1003.1-2001, глава 2, «Соответствие»), там описывается включены ли какие-либо служебные данные, такие как длины строк, NULL
терминаторы, указатели или байты выравнивания в это общее количество.
Аргумент path для posix_spawn() — это путь, который идентифицирует файл образа нового процесса для выполнения.
Параметр file для posix_spawnp() используется для создания пути, который идентифицирует файл образа нового процесса. Если параметр file содержит символ косой черты, параметр file будет использоваться в качестве пути к файлу образа нового процесса. В противном случае префикс пути для этого файла будет получен путем поиска в каталогах, переданных в качестве переменной среды PATH
(см. том «Базовые определения» стандарта IEEE Std 1003.1-2001, глава 8, «Переменные среды».) Если эта переменная среды не определена, результаты поиска определяются конкретной реализацией системной библиотеки.
Если file_actions является NULL
указателем, то файловые дескрипторы, открытые в вызывающем процессе, останутся открытыми в дочернем процессе, за исключением тех, для которых установлен флаг закрытия при выполнении FD_CLOEXEC
(см. fcntl()). Для тех дескрипторов файлов, которые остаются открытыми, все атрибуты соответствующих дескрипторов открытых файлов, включая блокировки файлов (см. fcntl()), останутся неизменными. Если file_actions не равно NULL
, то файловые дескрипторы, открытые в дочернем процессе, будут открытыми в вызывающем процессе, измененном объектом файловых действий, на который указывает file_actions и флаг FD_CLOEXEC
каждого оставшегося дескриптора открытого файла. Порядок обработки действий над файлом будет следующим:
FD_CLOEXEC
(см. fcntl()), будет закрыт. Тип posix_spawnattr_t
- объект атрибутов создания процесса определен в <spawn.h>
. Он будет содержать как минимум атрибуты, определенные ниже:
POSIX_SPAWN_SETPGROUP
установлен в атрибуте flags объекта, на который ссылается attrp, а атрибут родительской группы создания процесса pgroup того же объекта не равен нулю, то группа дочерних процессов будет указана в атрибуте pgroup объекта, на который ссылается attrp.
В качестве особого случая, если флаг POSIX_SPAWN_SETPGROUP
установлен в атрибуте flags объекта, на который ссылается attrp, а атрибут родительской группы создания процесса pgroup того же объекта установлен в ноль, то дочерний элемент будет в новой группе процессов с идентификатором группы процессов, равным его идентификатору процесса. Если флаг POSIX_SPAWN_SETPGROUP
не установлен в атрибуте flags объекта, на который ссылается attrp, новый дочерний процесс унаследует группу родительского процесса.
POSIX_SPAWN_SETSCHEDPARAM
установлен в атрибуте flags объекта, на который ссылается attrp, но флаг POSIX_SPAWN_SETSCHEDULER
не установлен, новый образ процесса изначально будет иметь поведение планирования вызывающего процесса с параметрами планирования, указанными в атрибуте schedparam объекта, на который ссылается attrp.
POSIX_SPAWN_SETSCHEDULER
установлен в атрибуте flags объекта, на который ссылается attrp (независимо от установки флага POSIX_SPAWN_SETSCHEDPARAM
), новый образ процесса изначально будет иметь поведение планирования, указанную в атрибуте schedpolicy объекта, на который ссылается attrp, и параметры планирования, указанные в атрибуте schedparam создания процесса того же объекта.
POSIX_SPAWN_RESETIDS
в атрибуте flags объекта, на который ссылается attrp, определяет эффективный идентификатор пользователя дочернего процесса. Если этот флаг не установлен, дочерний процесс унаследует эффективный идентификатор пользователя родительского процесса. Если этот флаг установлен, эффективный идентификатор пользователя дочернего процесса сбрасывается на реальный идентификатор пользователя родительского процесса. В любом случае, если установлен бит режима set-user-ID в файле образа нового процесса, эффективный идентификатор пользователя дочернего процесса станет идентификатором владельца этого файла до того, как образ нового процесса начнет выполняться.
Флаг POSIX_SPAWN_RESETIDS
в атрибуте flags объекта, на который ссылается attrp, также определяет эффективный идентификатор группы дочернего процесса. Если этот флаг не установлен, дочерний процесс наследует эффективный идентификатор группы родительского процесса. Если этот флаг установлен, эффективный идентификатор группы дочернего процесса сбрасывается на реальный идентификатор группы родительского процесса. В любом случае, если бит режима set-group-ID в файле образа нового процесса установлен, эффективный идентификатор группы дочернего процесса станет идентификатором группы этого файла до того, как образ нового процесса начнет выполняться.
POSIX_SPAWN_SETSIGMASK
установлен в атрибуте flags объекта, на который ссылается attrp, дочерний процесс изначально будет иметь маску сигнала, указанную в атрибуте sigmask объекта, на который ссылается attrp.
POSIX_SPAWN_SETSIGDEF
установлен в атрибуте flags объекта, на который ссылается attrp, сигналы, указанные в атрибуте sigdefault создания процесса того же объекта, будут установлены на действия по умолчанию в дочернем процессе. Сигналы, установленные в качестве действий по умолчанию в родительском процессе, будут установлены в действия по умолчанию в дочернем процессе. Сигналы, настроенные для перехвата вызывающим процессом, устанавливаются в качестве действий по умолчанию в дочернем процессе.
За исключением SIGCHLD
, сигналы, установленные для игнорирования образом вызывающего процесса, также устанавливаются для игнорирования дочерним процессом, если иное не указано флагом POSIX_SPAWN_SETSIGDEF
, установленным в атрибуте flags объекта, на который ссылается attrp, а также если сигналы не задаются в атрибуте sigdefault объекта, на который ссылается attrp.
Если сигнал SIGCHLD
настроен на игнорирование вызывающим процессом, то считается не опрделенным установлен ли сигнал SIGCHLD
на игнорирование или на действие по умолчанию в дочернем процессе, если иное не указано установленным флагом POSIX_SPAWN_SETSIGDEF
. в атрибуте spawn_flags объекта, на который ссылается attrp, или в сигнале SIGCHLD
, который определяется в атрибуте spawn_sigdefault объекта, на который ссылается attrp.
Если значение указателя attrp равно NULL
, то используются значения по умолчанию.
Все атрибуты процесса, кроме тех, на которые влияют атрибуты, установленные в объекте, на который ссылается attrp, как указано выше, или манипуляции с файловым дескриптором, указанные в file_actions, появляются в образе нового процесса, как если бы fork() был вызван для создания дочернего процесса, а затем дочерний процесс вызвал одну из функций семейства exec() для выполнения образа нового процесса.
От конкретной реализации системной библиотеки будет зависеть, запускаются ли обработчики fork() при вызове posix_spawn() или posix_spawnp().
После успешного завершения функция posix_spawn() возвращает родительскому процессу 0
и идентификатор дочернего процесса в переменной, на которую указывает аргумент pid, если он не равен NULL
. В противном случае дочерний процесс не создается, функция возвращается номер ошибки, а значение переменной, на которую указывает аргумент pid являетя неопределенным.
posix_spawnattr_t
, posix_spawn_file_actions_t
, либо в среде присутствует более одного PATH
. ENOENT
. Используйте posix_spawnp(), если необходимо выполнить поиск исполняемого файла для создания. Если в образ также включены модули адаптивного партиционирования (Adaptive Partitioning), могут быть возвращены дополнительные коды ошибок:
posix_spawnattr_t
указывает на несуществующую партицию памяти. Новому процессу не удалось ассоциироваться с одной или несколькими партициями памяти, унаследованными от родительского процесса. 127
. 127
). POSIX_SPAWN_SETPGROUP
установлен в атрибуте flags объекта, на который ссылается attrp, и posix_spawn() или posix_spawnp() не удается изменить группу дочернего процесса, то значение ошибки будет возвращается так, как описано в setpgid() (или, если ошибка возникает после успешного завершения вызывающего процесса, дочерний процесс завершается со статусом выхода 127
). POSIX_SPAWN_SETSCHEDPARAM
установлен, а флаг POSIX_SPAWN_SETSCHEDULER
не установлен в атрибуте flags объекта, на который ссылается attrp, то, если posix_spawn() или posix_spawnp() завершается ошибкой из-за причин, которые могут привести к сбою sched_setparam(), то будет возвращено значение ошибки так, как описано sched_setparam() (или, если ошибка возникает после успешного завершения вызывающего процесса, дочерний процесс завершается с статус выхода 127
). POSIX_SPAWN_SETSCHEDULER
установлен в атрибуте flags объекта, на который ссылается attrp, и posix_spawn() или posix_spawnp() не работает по причинам, которые могут вызвать сбой sched_setscheduler(), то будет возвращено значение ошибки так,как описано в sched_setscheduler() (или, если ошибка возникает после успешного завершения вызывающего процесса, дочерний процесс завершается со статусом выхода 127
). NULL
и определяет какие-либо действия из списка: close(), dup2() или open(), которые необходимо выполнить, и если posix_spawn() или posix_spawnp() завершается сбоем по любой из причин, которые могут привести к сбою close(), dup2() или open(), то значение ошибки будет возвращено так, как описывается в close(), dup2() и open() соответственно (или, если ошибка возникает после успешного завершения вызывающего процесса, дочерний процесс завершится со статусом выхода @с 127). Файловое действие open() само по себе может привести к любой из ошибок, описанных в close() или dup2(), в дополнение к ошибкам, описанным в open()). POSIX 1003.1 Realtime Signals Extension
close(), dup2(), fcntl(), fork(), open(), posix_spawn_file_actions_addclose(), posix_spawn_file_actions_adddup2(), posix_spawn_file_actions_addopen(), posix_spawn_file_actions_destroy(), posix_spawn_file_actions_init(), posix_spawnattr_addpartid(), posix_spawnattr_addpartition(), posix_spawnattr_destroy(), posix_spawnattr_getcred(), posix_spawnattr_getflags(), posix_spawnattr_getnode(), posix_spawnattr_getpartid(), posix_spawnattr_getpgroup(), posix_spawnattr_getrunmask(), posix_spawnattr_getschedparam(), posix_spawnattr_getschedpolicy(), posix_spawnattr_getsigdefault(), posix_spawnattr_getsigignore(), posix_spawnattr_getsigmask(), posix_spawnattr_getstackmax(), posix_spawnattr_getxflags(), posix_spawnattr_init(), posix_spawnattr_setcred(), posix_spawnattr_setflags(), posix_spawnattr_setnode(), posix_spawnattr_setpgroup(), posix_spawnattr_setschedparam(), posix_spawnattr_setrunmask(), posix_spawnattr_setschedpolicy(), posix_spawnattr_setsigdefault(), posix_spawnattr_setsigignore(), posix_spawnattr_setstackmax(), posix_spawnattr_setxflags(), posix_spawnp(), setpgid(), sched_setparam(), sched_setscheduler(), stat()
Предыдущий раздел: Описание API системной библиотеки