Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform | страница 23
Запуск процесса
Теперь обратим внимание на функции, предназначенные для работы с потоками и процессами. Любой поток может осуществить запуск процесса; единственные налагаемые здесь ограничения вытекают из основных принципов защиты (правила доступа к файлу, ограничения на привилегии и т.д.). По всей вероятности, вам уже доводилось запускать процессы — либо из системного сценария, либо из командного интерпретатора, или из программы от своего имени.
Например, при запуске процесса из командного интерпретатора вы можете ввести командную строку:
>$ program1
Это предписывает командному интерпретатору запустить программу >program1
и ждать завершения ее работы. Или, вы могли набрать:
>$ program2 &
Это предписывает командному интерпретатору запустить программу >program2
без ожидания ее завершения. В таком случае говорят, что программа >program2
работает в фоновом режиме.
Если вы пожелаете скорректировать приоритет программы до ее запуска, вы можете применить команду >nice
— точно так же, как в UNIX:
>$ nice program3
Это предписывает командному интерпретатору запустить программу >program3
с заниженным приоритетом.
Или нет?
Если посмотреть, что происходит в действительности, то мы велели командному интерпретатору выполнить программу, называемую >nice
, с обычным приоритетом. Команда >nice
затем занизила свой собственный приоритет (отсюда и имя программы «nice» — «благовоспитанная») и затем запустила программу >program3
с этим заниженным приоритетом.
Нас обычно не заботит тот факт, что командный интерпретатор создает процессы — это просто подразумевается. В некоторых прикладных задачах можно положиться на сценарии командного интерпретатора (пакеты команд, записанные в файл), которые сделают эту работу за вас, но в ряде других случаев вы пожелаете создавать процессы самостоятельно.
Например, в большой мультипроцессорной системе вы можете пожелать, чтобы одна главная программа выполнила запуск всех других процессов вашего приложения на основании некоторого конфигурационного файла. Другим примером может служить необходимость запуска процессов по некоторому событию.
Рассмотрим некоторые из функций, которые QNX/Neutrino обеспечивает для запуска других процессов (или подмены одного процесса другим):
• system();
• семейство функций exec();
• семейство функций spawn();
• fork();
• vfork().
Какую из этих функций применять, зависит от двух требований: переносимости и функциональности. Как обычно, между этими двумя требованиями возможен компромисс.