Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform | страница 25



создает другой процесс (с новым идентификатором), который соответствует программе, указанной в аргументах функции.

SpawnPOSIXExecPOSIX
spawn()Да
spawnl()Нетexecl()Да
spawnle()Нетexecle()Да
spawnlp()Нетexeclp()Да
spawnlpe()Нетexeclpe()Нет
spawnp()Да
spawnv()Нетexecv()Да
spawnve()Нетexecve()Да
spawnvp()Нетexecvp()Да
spawnvpe()Нетexecvpe()Нет

Рассмотрим различные варианты функций exec() и spawn(). В таблице, представленной ниже, вы увидите, что некоторые функции из них предусмотрены POSIX, а некоторые — нет. Конечно, для максимальной переносимости, следует использовать только POSIX-совместимые функции.

При том, что названия функций могут показаться малопонятными, в их суффиксах есть логика.

Суффикс:Смысл:
l (нижний регистр «L»)Список аргументов определяется через список параметров, заданный непосредственно в самом вызове и завершаемый нулевым аргументом NULL.
еУказывается окружение.
pЕсли не указано полное имя пути программы, для ее поиска используется переменная окружения PATH.
vСписок аргументов определяется через указатель на вектор (массив) аргументов.

Список аргументов здесь — список аргументов командной строки, передаваемых программе.

Заметьте, что в библиотеке языка Си функции spawnlp(), spawnvp() и spawnlpe() все вызывают функцию spawnvpe(), которая, в свою очередь, вызывает POSIX-функцию spawnp(). Функции spawnle(), spawnv() и spawnl() все в конечном счете вызывают функцию spawnve(), которая затем вызывает POSIX-функцию spawn(). И, наконец, POSIX-функция spawnp() вызывает POSIX-функцию spawn(). Таким образом, в основе всех возможностей семейства spawn() лежит сам вызов spawn().

Рассмотрим теперь различные варианты функций spawn() и exec() более подробно так, чтобы вы смогли получить навык свободного использования различных суффиксов. Затем мы перейдем непосредственно к рассмотрению вызова функции spawn().

Суффикс «l»

Например, если я хочу вызвать команду >ls с аргументами >-t, >-r, и >-l (означает — «сортировать выходные данные по времени в обратном порядке и показывать выходные данные в длинном формате»), я мог бы определить это в программе так:

>/* Вызвать ls и продолжить выполнение */

>spawnl(P_WAIT, "/bin/ls", "/bin/ls", "-t", "-r", "-l",

> NULL);


>/* Заменить себя на ls */

>execl(P_WAIT, "/bin/ls", "/bin/ls", "-t", "-r", "-l",

> NULL);

Или, вариант с применением суффикса v:

>char *argv[] = {

> "/bin/ls",

> "-t",

> "-r",

> "-l",

> NULL

>};


>/* Вызвать ls и продолжить выполнение */

>spawnv(P_WAIT, "/bin/ls", argv);