Зачем использовать POSIX Spawn?
В posix_spawn () а также posix_spawnp () обе функции используются для создания нового дочернего процесса. Затем дочерний процесс выполняет файл. Эти функции были определены POSIX для стандартизации метода создания новых процессов для машин, не поддерживающих системный вызов fork. Эти машины обычно небольшие и не имеют встроенных систем для поддержки lMMU.
Эти две функции объединяют fork и exec с некоторыми дополнительными шагами, которые выполнят дочерний элемент. Они действуют как подмножество функциональных возможностей, обычно достигаемых с помощью вилки, для всех системных вызовов и встроенных систем, которые не имеют такой функциональности.
Пример 1: posix_spawn ()
В этом примере мы будем использовать функцию spawn () для создания и выполнения нового дочернего процесса. Затем мы объясним все соответствующие аргументы, используемые в функции.
В примере используются следующие аргументы:
Аргумент | Описание |
---|---|
Используется для определения всех операций, выполняющих возрождение. | |
дорожка | Имя пути, который должен быть выполнен. |
fd_count | Количество записей с массивом fd_map. Если fd_count равно 0, то fd_map игнорируется. В таких случаях дочерний процесс наследует все файловые дескрипторы, игнорируя те, которые были изменены. |
fd_map | Массив файловых дескрипторов, которые наследуются дочерним процессом. Здесь, если значение fd_count не равно 0, то fd_map необходим для приведения файловых дескрипторов fd_count к высшему значению OPEN_MAX. Оно имеет: · Вход дочернего процесса · Выход · Значения ошибок |
наследовать | Наследование структуры показывает, что пользователи хотят, чтобы их дочерний процесс унаследовал все от родительского. |
argv | Указатель на конкретный вектор аргументов. Значение argv [0] не может быть NULL и должно быть именем загружаемого файла. Значение argv не может быть равно NULL. |
envp | Указывает на массив символьных указателей. Каждый из указателей в этом массиве указывает на переменную среды. Конечная точка массива - указатель NULL. |
Пример 2: тест.c
В следующем примере создается новый дочерний процесс для запуска команды с помощью / bin / sh -c. Это значение, переданное в качестве первого аргумента. В контрольная работа.c код выглядит следующим образом:
В приведенном выше примере мы вызвали библиотеки, а затем вызвали порождать.час заголовок. Вы также увидите posix_spawn () вызывается для создания дочернего процесса в приведенном выше примере. В порождать а также спавн функции используются вместо вилка а также exec функции. Порождать() обладает гибкостью и во многом упрощает работу пользователей. Это немного отличается от система() а также exec (). Он вернется и создаст новый дочерний процесс. В нашем примере это пид. Выше видно, что функция ожидания waitpid (), тогда система() используется. Обратите внимание, что порождать() а также вилка() вызывающие процессы одинаковы, а способ реализации более или менее одинаков для обеих функций.
Теперь мы выполним пример, используя gcc компилятор. Вы также можете использовать любой другой компилятор по вашему выбору:
$ sudo gcc test.c -lrt
Далее запустите следующее:
$ ./ а.вне
Результат выполнения вышеуказанной команды будет выглядеть следующим образом:
Ребенок пид будет создан, как вы можете видеть в приведенном выше выводе.
Библиотека
Libc: Используйте -l c, чтобы связать gcc компилятор. Обратите внимание, что эта библиотека включается автоматически.
Порождать()
В порождать() функция основана на POSIX 1003.1d проект стандарта, используемый как posix_spawn (). Библиотека C включает функции spawn * (). Здесь мы перечислим несколько суффиксов вместе с их описаниями:
е: используется как массив для переменных среды.
l: используется как завершающийся NULL список аргументов, используемых внутри программы.
п: используется для определения относительного пути. Если в значении пути нет косой черты, то система использует и ищет в переменной среды PATH любую похожую программу.
v: действует как вектор аргументов внутри программы.
Отображение дескрипторов файлов
В порождать(), мы практикуем fd_count а также fd_map аргументы для вызова файловых дескрипторов. Он указывает, какой дочерний элемент унаследовать.
Число, используемое в качестве дескриптора файла для дочернего процесса, зависит от его местоположения внутри fd_map. Здесь мы рассмотрим пример родителя с файловыми дескрипторами, имеющими значение 1, 3 и 5, тогда отображение будет примерно таким:
>> int fd_map = 1, 3, 5;Для ребенка | Для родителя |
---|---|
0 | 1 |
1 | 3 |
2 | 5 |
Обратите внимание, что если вы используете явный fd_map чтобы сопоставить эти файловые дескрипторы с дочерним и родительским, вы должны сопоставить SPWAN_FDCLOSE функция для продолжения.
Флаги наследования
В Spawn пользователям необходимо активировать любой из следующих флагов в случае наследования. Некоторые примеры флагов появления и их описания приведены ниже:
Флаг | Описание |
---|---|
SPAWN_ALIGN_DEFAULT | Этот флаг используется для установки настроек по умолчанию для настройки выравнивания. |
SPAWN_ALIGN_FAULT | Этот флаг используется для ошибки несовпадения ссылок на данные. |
SPAWN_ALIGN_NOFAULT | Этот флаг используется для исправления неисправности несоосности. |
SPAWN_DEBUG | Этот флаг используется для отладки ядра. |
SPAWN_EXEC | SPAWN действует как exec * (), используя этот флаг. |
SPAWN_EXPLICIT_CPU | Этот флаг используется для установки маски запуска и наследования элемента mask = run mask. |
SPAWN_EXPLICIT_SCHED | Этот флаг используется для установки политики планирования. |
В <порождать.час> определяет эту маску SPAWN_ALIGN_MASK используется для выравнивания флагов, перечисленных выше.
pid_t pgroup | Группа дочерних процессов, если вы укажете SPAWN_SETGROUP в члене флага. |
int runmask | Маска выполнения дочернего процесса для наследования масок, согласованных на основе значения этого члена. |
sigset_t sigmask | Маска сигнала для дочернего процесса, которая используется для определения статуса членов флага. |
sigset_t sigdefault | Набор дочерних процессов сигналов по умолчанию. |
Ошибки
В posix_spawn () а также posix_spawnp () функции также могут давать сбой в некоторых случаях, например, в следующих случаях:
EINVAL: Это тот случай, когда значение, обозначенное file_actions или же attrp не правильно и адекватно.
Когда основной вызов fork (2), fork (2) или clone (2) терпит неудачу, порождать() функции вернут номер ошибки.
ЭНОСИС: Это тот случай, если функция и ее поддержка не включены или не предоставляются в системе.
Заключение
В этом руководстве рассмотрены основные функции, предоставляемые POSIX_spawn () и функции, используемые им для выполнения и выполнения своих функций. Мы также рассмотрели флаги и ошибки, обычно используемые Spawn.