Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
P_WAIT | Вызывающий процесс (ваша программа) будет блокирован до тех пор, пока вновь созданный процесс не отработает и не завершится. |
P_NOWAIT | Вызывающая программа не будет блокирована на время выполнения вновь созданной. Это позволяет вам запустить программу в фоновом режиме и продолжать выполнение, пока она делает свое дело. |
P_NOWAITO | Аналогично P_NOWAIT за исключением того, что устанавливается флаг SPAWN_NOZOMBIE. Это означает, что вы не должны беспокоить себя вызовом функции waitpid для очистки кода завершения
|
P_OVERLAY | Этот флаг превращает вызов функции spawn в соответствующей вызов exec! Ваша программа преобразуется в указанную программу без изменения идентификатора процесса ID. Вообще-то, если вы хотите сделать именно так, то, наверное, будет более корректно использовать вызов exec, поскольку это избавит будущих читателей ваших исходных текстов от необходимости искать P_OVERLAY в справочном руководстве по библиотеке языка Си! |
Как мы упомянули выше, все функции семейства spawn, в конечном счете, вызывают базовую функцию spawn. Ниже приведен прототип функции spawn:
Мы можем не обращать внимание на параметры path, argv, и envp — мы уже рассмотрели их выше как местоположение исполняемого модуля (path), вектор параметров (argv) и окружение (envp).
Параметры fd_count и fd_map идут вместе. Если вы задаете нуль в fd_count, тогда fd_map игнорируется, и это означает, что вновь создаваемый процесс унаследует от родительского все дескрипторы файлов (кроме тех, которые модифицированы флагом FD_CLOEXEC функции fcntl). Если параметр fd_count имеет ненулевое значение, то он задает число дескрипторов файлов, содержащихся в fd_map, и будут унаследованы только они.
Параметр inherit — это указатель на структуру, которая содержит набор флагов, маски сигналов, и т.д. Для получения более подробной информации об этом вам следует обратиться за помощью к справочному руководству по библиотеке языка Си.
Предположим, что вы решили создать новый процесс, который был бы идентичен работающему в настоящее время процессу, и сделать это так, чтобы эти два процесса выполнялись одновременно. Вы могли бы решить эту проблему с помощью функции spawn (и параметра P_NOWAIT), передав вновь создаваемому процессу достаточно информации о точном состоянии вашего процесса, чтобы новый процесс мог настроить себя сам. Однако, такой подход может оказаться чрезвычайно сложным, потому что описание «текущего состояния» процесса может потребовать большого количества данных.
Существует более простой способ — применение функции fork которая просто копирует текущий процесс. У результирующего процесса как код, так и данные полностью совпадают с таковыми для родительского процесса.
Конечно же, невозможно создать процесс, который во всем был бы идентичен родительскому. Почему? Наиболее очевидное различие между этими двумя процессами должно быть в идентификаторе
Если после ветвления по fork получаются два одинаковых процесса, то как же их различить? Когда вы вызываете fork, вы тем самым создаете другой процесс, выполняющий тот же самый код и в том же самом местоположении (то есть оба процесса ввернутся из вызова fork), что и родительский. Рассмотрим пример программы:
После вызова fork оба процесса выполнят второй вызов printf! Если вы запустите эту программу на выполнение, она выведет на экран примерно следующее:
Иными словами, оба процесса выведут вторую строку.
Существует только один способ различить эти два процесса — он заключается в использовании возвращаемого функцией fork значения, размещенного в retval. Во вновь созданном дочернем процессе retval будет иметь нулевое значение, а в родительском она будет содержать идентификатор дочернего.
Китайская грамота, да? Проясним этот момент еще одним фрагментом программы:
Эта программа выведет на экран примерно следующее:
Таким образом, после применения функции fork вы можете определить, в каком процессе находитесь («отец» это или «сын»), анализируя значение, возвращаемое функцией fork.
Применение функции vfork по сравнению с обычной fork позволяет существенно сэкономить на ресурсах, поскольку она делает разделяемым адресное пространство родителя.
Функция vfork создает «сына», но затем приостанавливает родительский поток до тех пор, пока «сын» не вызовет функцию exec или не завершится (с помощью exit или его друзей). В дополнение к этому, функция vfork будет работать в системах с физической моделью памяти, в то время как функция fork не сможет, потому что нуждается в создании такого же адресного пространства, а это в физической модели памяти просто невозможно.
70 Рублей
1. 70 Рублей
Фантастика:
фэнтези
боевая фантастика
попаданцы
постапокалипсис
рейтинг книги
Переписка 1826-1837
Документальная литература:
публицистика
рейтинг книги

Морской волк. 1-я Трилогия
1. Морской волк
Фантастика:
альтернативная история
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель
Фантастика:
фэнтези
героическая фантастика
рейтинг книги
Честное пионерское! Часть 4
4. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
рейтинг книги
Здравствуйте, я ваша ведьма! Трилогия
Здравствуйте, я ваша ведьма!
Фантастика:
юмористическая фантастика
рейтинг книги
Мое ускорение
5. Девяностые
Фантастика:
попаданцы
альтернативная история
рейтинг книги
Прорвемся, опера! Книга 2
2. Опер
Фантастика:
попаданцы
альтернативная история
рейтинг книги
Невеста напрокат
Любовные романы:
любовно-фантастические романы
рейтинг книги
Если твой босс... монстр!
Любовные романы:
любовно-фантастические романы
рейтинг книги
Приватная жизнь профессора механики
Проза:
современная проза
рейтинг книги
