Программирование на C

POSIX Spawn с программированием на C

POSIX Spawn с программированием на C
Spawn - это функция, используемая в POSIX для загрузки и выполнения дочерних процессов. Текущий процесс в POSIX либо продолжит, либо не продолжит выполнение этих дочерних процессов и других процессов асинхронно. Всякий раз, когда создается новый подпроцесс, ему требуется определенная память, которая позволит родительскому и дочернему процессу выполнять. В Microsoft Windows, UNIX и Linux существует определенное семейство порождений; и другие семейства функций появления считаются дополнительным расширением.

Зачем использовать 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.

Топ-5 карт для захвата игр
Все мы видели и любили потоковые игры на YouTube. PewDiePie, Jakesepticye и Markiplier - лишь некоторые из лучших игроков, которые заработали миллионы...
Как разработать игру в Linux
Десять лет назад не многие пользователи Linux могли бы предсказать, что их любимая операционная система однажды станет популярной игровой платформой д...
Порты коммерческих игровых движков с открытым исходным кодом
Бесплатные игры с открытым исходным кодом и кроссплатформенные версии игрового движка можно использовать для игры как в старые, так и в некоторые из с...