spawnl()

Создать дочерний процесс с заданным списком аргументов

Прототип:

#include <process.h>
int spawnl( int mode,
const char *path,
const char *arg0,
const char *arg1,
...
const char *argn,
NULL );

Аргументы:

mode
Способы загрузки дочернего процесса и ожидания в родительском:
P_WAIT
загрузка в доступную память, исполнение процесса и блокирование родителя до завершения потомка.
P_NOWAIT
родитель и потомок исполняются параллельно.
P_NOWAITO
родитель и потомок исполняются параллельно, но при этом родитель не может использовать wait() для получения кода завершения потомка.
P_OVERLAY
замещение в памяти родительского процесса дочерним и исполнение потомка; в родительском процессе возвращения управления не производится (это равносильно вызову функции exec*()).
path
Полный путь поиска исполняемого файла.
arg0, ... argn, NULL
Аргументы, передаваемые дочернему процессу. По крайней мере должен быть передан параметр arg0, содержащий имя программы (значение NULL недопустимо). Список аргументов должен завершаться NULL.

Библиотека:

libc

Описание:

Функция spawnl() создает и исполняет новый дочерний процесс на основе файла path с использованием NULL-терминированного списка аргументов в arg0 ... argn. Функция неявно вызывает spawnve().


Note: Если новый процесс является shell-скриптом, то его первая строка должна начинаться с #! с последующим именем программы-интерпретатора (опционально могут быть также переданы его аргументы). Скрипт также должен иметь разрешения на исполнение.

Данная функция не является частью стандарта POSIX 1003.1 и не дает гарантии одинакового исполнения во всех операционных системах. Она формирует массив argv[] перед неявным вызовом spawn().

Перечисленные на рисунке функции в конечном счете вызывают spawn():

spawnall.jpg
Рисунок 1. Большинство функций spawn*() предпринимают ряд настроечных действий перед отправкой сообщения procnto-* функцией spawn()

Аргументы передаются дочернему процессу путем передачи одного или нескольких указателей на соответствующие строки. При передаче потомку они объединяются, но каждый аргумент разделяется пробелом.

Дочерний процесс наследует переменные окружения родителя (или просто окружение). Их значения могут быть определены утилитами export и env или функциями putenv() и setenv(). Программа может считать их через функцию getenv().


Note: Отношения родитель-потомок не означают, что потомок будет завершен при смерти родителя.

Возвращаемое значение:

Функция возвращает значение в зависимости от аргумента mode:

mode = P_WAIT
Возвращается статус код завершения дочернего процесса.
mode = P_NOWAIT
Возвращается идентифиатор дочернего процесса. Получение кода его завершения возможно с помощью функции waitpid().
mode = P_NOWAITO
Возвращается идентифиатор дочернего процесса или 0, если процесс порожден на удаленном узле. Получение кода завершения потомка невозможно.

Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

Функция устанавливает коды ошибок, используемые spawn(), и дополнительно:

ECHILD
Параметр mode равен P_WAIT, но потомок завершился до вызова waitpid() родителем.

Примеры:

Исполнение команды:

myprog ARG1 ARG2

в исходном коде выполняется следующим образом:

#include <stddef.h>
#include <process.h>
int exit_val;
...
exit_val = spawnl( P_WAIT, "myprog", "myprog", "ARG1", "ARG2", NULL );
...

Программа myprog будет найдена в том случае, если она размещена в текущей директории.

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

ЗОСРВ «Нейтрино»

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

Предостережения:

Если mode равно P_WAIT, данная функция является точкой остановки потока.

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

execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(), getenv(), putenv(), setenv(), spawn(), spawnle(), spawnlp(), spawnlpe(), spawnp(), spawnv(), spawnve(), spawnvp(), spawnvpe(), wait(), waitpid()




Предыдущий раздел: Описание API системной библиотеки