Создать и выполнить новый дочерний процесс с заданием относительного пути
#include <spawn.h>pid_t spawnp( const char *file,int fd_count,const int fd_map[ ],const struct inheritance *inherit,char * const argv[ ],char * const envp[ ] );
/
, он используется как путь поиска файла. В противном случае путь поиска определяется по содержимому переменной окружения PATH
.Если необходимо использовать spawnp() удаленно, следует установить поле nd структуры struct inheritance с помощью функции netmgr_strtond(). |
NULL
и должно представлять имя файла загружаемой программы. Последний член массива должен быть всегда равен NULL
. Сам указатель argv не может быть равен NULL
.NULL
. Формат каждой строки должен быть следующим: variable=value. Если envp равен NULL
, то дочерний процесс унаследует переменные окружения родителя.libc
Функция spawnp() создает и исполняет новый дочерний процесс на основе файла file. Она также устанавливает флаги SPAWN_CHECK_SCRIPT
и SPAWN_SEARCH_PATH
при неявном вызове spawn().
Если новый процесс является 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.
Если file относится к файловой системе с установленным флагом ST_NOSUID
, то: EUID, EGID, сохраненные UID/GID для потомка не меняются. В противном случае, если бит сохранения UID установлен, EUID потомка устанавливается в UID владельца файла file. Аналогичная история с установкой бита сохранения GID и GID владельца файла file. RUID, RGID и дополнительные идентификаторы групп остаются соответствующими родителю. EUID и EGID потомка сохраняются как сохраненные UID/GID для использования в setuid().
Допустим, что вызвана функция spawnp():
spawnp( file, fd_count, fd_map, inherit, argv, envp );
при этом будет выполнено следующее:
NULL
CHECK_SCRIPT
SPAWN_SEARCH_PATH
и только после этого неявно вызывается spawn().
Отношения родитель-потомок не означают, что потомок будет завершен при смерти родителя. |
Идентификатор дочернего процесса. Если возникла ошибка функция возвращает -1
, код ошибки записывается в errno.
Если установлен флаг SPAWN_EXEC в поле flags структуры struct inheritance, spawnp() не возвращает управление в отсутствии ошибок. |
Функция устанавливает коды ошибок, используемые spawn().
ЗОСРВ «Нейтрино»
struct inheritance, execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(), getenv(), netmgr_strtond(), putenv(), setenv(), sigaddset(), sigdelset(), sigemptyset(), sigfillset(), spawn(), spawnl(), spawnle(), spawnlp(), spawnlpe(), spawnv(), spawnve(), spawnvp(), spawnvpe(), wait(), waitpid()
Предыдущий раздел: Описание API системной библиотеки