Создать и выполнить новый дочерний процесс
#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 системной библиотеки