posix_spawn()

Создать процесс

Прототип:

#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] );

Аргументы:

argv
Указатель на вектор аргументов. Значение в argv[0] должно содержать имя файла загружаемой программы, но может иметь значение NULL, если аргументы не передаются. Последним элементом argv должен быть NULL указатель. Сам указатель argv не может иметь значение NULL.
attrp
Указатель на атрибуты создаваемого процесса. Если значение указателя attrp равно NULL, то используются значения по умолчанию.
envp
Указатель на массив указателей на символьные строки, определяющие переменную среды. Последним элементом envp должен быть NULL указатель. Каждый указатель в массиве характеризует строку вида:
переменная=значение
данный формат используется для определения переменной среды. Если значение envp равно NULL, то дочерний процесс наследует окружение родительского процесса.
file_actions
Параметр file_actions определяет действия с создаваемым файлом.
path
Полный путь к исполняемому файлу. Используйте posix_spawnp() для поиска исполняемого файла при создании процесса.
pid
Возвращаемый идентификатор процесса.

Библиотека:

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 каждого оставшегося дескриптора открытого файла. Порядок обработки действий над файлом будет следующим:

  1. Первоначально набор дескрипторов открытых файлов для дочернего процесса будет таким же, как и для вызывающего процесса. Все атрибуты соответствующих дескрипторов открытых файлов, включая блокировки файлов (см. fcntl()), останутся без изменений.

  2. Маска сигналов, действия с ними по умолчанию и эффективные идентификаторы пользователя и группы для дочернего процесса будут изменены, как указано в объекте атрибутов, на который ссылается attrp.

  3. Действия с файлом, указанные в file_actions, будут выполняться в том порядке, в котором они были добавлены.

  4. Любой файловый дескриптор, для которого установлен флаг FD_CLOEXEC (см. fcntl()), будет закрыт.

Тип posix_spawnattr_t - объект атрибутов создания процесса определен в <spawn.h>. Он будет содержать как минимум атрибуты, определенные ниже:

Сигналы, настроенные для перехвата вызывающим процессом, устанавливаются в качестве действий по умолчанию в дочернем процессе.

За исключением 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 являетя неопределенным.

Коды ошибок:

EINVAL
Для любого недопустимого параметра. Был предоставлен недопустимый аргумент или неправильно инициализированны объекты posix_spawnattr_t, posix_spawn_file_actions_t, либо в среде присутствует более одного PATH.
EIO
В библиотеке произошла внутренняя ошибка.
ENOENT
Аргумент path не найден. Аргумент path должен быть полным путем к исполняемому файлу; в противном случае будет возвращено ENOENT. Используйте posix_spawnp(), если необходимо выполнить поиск исполняемого файла для создания.
ENOMEM
Память, необходимая для создания сообщения для отправки procnto-*, не может быть выделена при создании нового процесса. Связанные с этим процессом структуры данных также не могут быть выделены. Для партиций адаптированного квотирования: идентификатор партиции не удалось добавить к объекту атрибутов.
EOK
Успешное завершение.
errno
Любая ошибка, возвращаемая stat() для пути path.
ETXTBSY
Файл, который нужно выполнить, занят (например, он может быть открыт для записи).

Если в образ также включены модули адаптивного квотирования (Adaptive Partitioning), могут быть возвращены дополнительные коды ошибок:

EACCES
Созданная программа не имеет разрешения на работу с указанными партициями.
EEXIST
Произошла одна из следующих ошибок:
ENOMEM
Объект posix_spawnattr_t указывает на несуществующую партицию памяти. Новому процессу не удалось ассоциироваться с одной или несколькими партициями памяти, унаследованными от родительского процесса.
Для EINVAL, posix_spawn() может завершиться ошибкой, если:

Классификация:

POSIX 1003.1 RTS

Точка остановки потока
Нет
Обработчик прерываний
Да
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

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 системной библиотеки