Если посмотреть, что происходит в действительности, то мы велели командному интерпретатору выполнить программу, называемую nice
, с обычным приоритетом. Команда nice
затем занизила свой собственный приоритет (отсюда и имя программы «nice» — «благовоспитанная») и затем запустила программу program3
с этим заниженным приоритетом.
Нас обычно не заботит тот факт, что командный интерпретатор создает процессы — это просто подразумевается. В некоторых прикладных задачах можно положиться на сценарии командного интерпретатора (пакеты команд, записанные в файл), которые сделают эту работу за вас, но в ряде других случаев вы пожелаете создавать процессы самостоятельно.
Например, в большой мультипроцессорной системе вы можете пожелать, чтобы одна главная программа выполнила запуск всех других процессов вашего приложения на основании некоторого конфигурационного файла. Другим примером может служить необходимость запуска процессов по некоторому событию.
Рассмотрим некоторые из функций, которые QNX/Neutrino обеспечивает для запуска других процессов (или подмены одного процесса другим):
•
• семейство функций
• семейство функций
•
•
Какую из этих функций применять, зависит от двух требований: переносимости и функциональности. Как обычно, между этими двумя требованиями возможен компромисс.
Обычно при всех запросах на создание нового процесса происходит следующее. Поток в первоначальном процессе вызывает одну из вышеприведенных функций. В конечном итоге, функция заставит администратор процессов создать адресное пространство для нового процесса. Затем ядро выполнит запуск потока в новом процессе. Этот поток выполнит несколько инструкций и вызовет функцию
Функция
Фактически, для обработки команды, которую вы желаете выполнить, функция
Редактор, который я использую при написании данной книги, использует вызов
system("pwd");
Подходит ли функция
Давайте рассмотрим ряд других функций создания процессов.
Следующие функции создания процессов, которые следует рассмотреть, принадлежат к семействам
Семейство функций
С другой стороны, семейство функций
Spawn | POSIX | Exec | POSIX |
---|---|---|---|
Да | |||
Нет | Да | ||
Нет | Да | ||
Нет | Да | ||
Нет | Нет | ||
Да | |||
Нет | Да | ||
Нет | Да | ||
Нет | Да | ||
Нет | Нет |
Рассмотрим различные варианты функций exec() и spawn(). В таблице, представленной ниже, вы увидите, что некоторые функции из них предусмотрены POSIX, а некоторые — нет. Конечно, для максимальной переносимости, следует использовать только POSIX-совместимые функции.
При том, что названия функций могут показаться малопонятными, в их суффиксах есть логика.