Создать и выполнить новый дочерний процесс
#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[ ] );
0
, fd_map игнорируется и дочерний процесс наследует открытые файловые дескрипторы родителя (исключая те, которые были модифицированы с помощью fcntl() и флагом FD_CLOEXEC).0
, то fd_map должен содержать ровно указанное число элементов, но не более OPEN_MAX
. Первые три записи при этом используются в качестве stdin, stdout и stderr. SPAWN_FDCLOSED
, то данный файловый дескриптор будет закрыт в дочернем процессе.Если необходимо использовать spawnp() удаленно, следует установить поле nd структуры struct inheritance с помощью функции netmgr_strtond(). |
NULL
и должно представлять имя файла загружаемой программы. Последний член массива должен быть всегда равен NULL
. Сам указатель argv не может быть равен NULL
.NULL
. Формат каждой строки должен быть следующим: variable=value. Если envp равен NULL
, то дочерний процесс унаследует переменные окружения родителя.libc
Функция spawn() создает и исполняет новый дочерний процесс на основе файла path.
Если новый процесс является shell-скриптом, то его первая строка должна начинаться с #! с последующим именем программы-интерпретатора (опционально могут быть также переданы его аргументы). Скрипт также должен иметь разрешения на исполнение. |
Данная функция относится только к ЗОСРВ «Нейтрино» (основано на стандарте POSIX 1003.1d). Системная библиотека также включает ряд специализированных функций вида spawn*(). Их имена содержат ряд дополнительных суффиксов:
Суффикс: | Влияние на принимаемые аргументы: |
---|---|
e | Массив переменных окружения. |
l | Список аргументов программы с завершающим символом NULL . |
p | Относительный путь. Если путь не содержит символ / , программа будет искаться по адресам, перечисленным в переменной PATH . Данный суффикс также позволяет конструкцию #! ; см. SPAWN_CHECK_SCRIPT далее. |
v | Векторный формат аргументов программы. |
Перечисленные на рисунке функции в конечном счете вызывают spawn():
Дочерний процесс наследует следующие атрибуты родителя:
SPAWN_SETGROUP
в inherit.flags) SPAWN_SETSIGMASK
в inherit.flags) SIG_DFL
SIG_IGN
(за исключением тех, которые модифицированы через inherit.sigdefault с установленным флагом SPAWN_SETSIGDEF
в inherit.flags). Дочерний процесс при этом имеет ряд отличий от родителя:
SIG_DFL
. Дочерний процесс также будет иметь следующие отличия от родителя, если установлен флаг SPAWN_EXEC:
SIGALRM
сигнала секунд устанавливается в 0
. Если дочерний процесс порождается на удаленном узле, идентификатор группы процессов и членство в сессии не настраиваются; процесс запускается в новой группе и сессии.
Доступ к переменным окружения в дочернем процессе осуществляется через environ.
Если path относится к файловой системе с установленным флагом ST_NOSUID
, то: EUID, EGID, сохраненные UID/GID для потомка не меняются. В противном случае, если бит сохранения UID установлен, EUID потомка устанавливается в UID владельца файла path. Аналогичная история с установкой бита сохранения GID и GID владельца файла path. RUID, RGID и дополнительные идентификаторы групп остаются соответствующими родителю. EUID и EGID потомка сохраняются как сохраненные UID/GID для использования в setuid().
Отношения родитель-потомок не означают, что потомок будет завершен при смерти родителя. |
Мапирование файловых дескрипторов
Допустимо использовать параметры fd_count и fd_map для определения перечня наследуемых файловых дескрипторов.
Номер результирующего дескриптора соответствует позиции в массиве fd_map. Например, в потомке необходимо унаследовать файловые дескрипторы со значениями 1
, 3
и 5
:
int fd_map = { 1, 3, 5 };
В этом случае таблица соответствия дескрипторов в потомке и родителе будет иметь вид:
Дескрипторы потомка: | Соответствующие дескрипторы родителя: |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Если родительские файловые дескрипторы 1
, 3
и 5
являются единственными и указано fd_count = 0
, будут продублированы все файловые дескрипторы и таблица соответствия примет вид:
Дескрипторы потомка: | Соответствующие дескрипторы родителя: |
---|---|
1 | 1 |
3 | 3 |
5 | 5 |
при этом в потомке дескрипторы 0
, 2
, 4
и 6
будут закрыты.
Если используется явный массив fd_map, то для воспроизведения предыдущей таблицы можно использовать SPAWN_FDCLOSE:
int fd_map = { SPAWN_FDCLOSE, 1, SPAWN_FDCLOSE, 3, SPAWN_FDCLOSE, 5 };
Используйте SPAWN_FDCLOSE с осторожностью для файловых дескрипторов 0 , 1 и2 . Если потомо вызовет open(), функция назначит открытому файлу наименьший доступный файловый дескриптор. Это может переназначить стандартные файловые потоки stdin, stdout и stderr. В этом случае некоторые функции, например, printf() будут использовать только что открытый файл для ввода-вывода, что может оказаться неочевидным.
Гораздо предсказуемее назначать файловые дескрипторы |
Идентификатор дочернего процесса. Если возникла ошибка функция возвращает -1
, код ошибки записывается в errno.
Если установлен флаг SPAWN_EXEC в поле flags структуры struct inheritance, spawn() не возвращает управление в отсутствии ошибок. |
ARG_MAX
. ST_NOEXEC
. NULL
). PATH_MAX
или один из компонентов пути превышает NAME_MAX
. SPAWN_CHECK_SCRIPT
для поля flags структуры struct inheritance. ЗОСРВ «Нейтрино»
struct inheritance, struct sched_param, execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(), getenv(), netmgr_strtond(), posix_spawn(), posix_spawnp(), putenv(), setenv(), sigaddset(), sigdelset(), sigemptyset(), sigfillset(), spawnl(), spawnle(), spawnlp(), spawnlpe(), spawnp(), spawnv(), spawnve(), spawnvp(), spawnvpe(), wait(), waitpid()
Предыдущий раздел: Описание API системной библиотеки