Запуск процесса может быть осуществлен из командного интерпретатора либо из любого потока с учетом ограничений вытекающих из основных принципов защиты (правила доступа к файлу, ограничения на привилегии и т. д.).
Для запуска процесса из командного интерпретатора необходимо ввести командную строку:
$ program1
Это предписывает командному интерпретатору запустить программу program1 и ждать завершения ее работы.
Если набрать:
$ program2 &
то это предписывает командному интерпретатору запустить программу program2 без ожидания ее завершения. В таком случае говорят, что программа program2 работает в фоновом режиме и из командной строки можно запустить другой процесс, например, programs.
Если необходимо при запуске потока скорректировать приоритет программы до ее запуска, например увеличить на 5, необходимо использовать команду nice:
$ nice 5 programs
Утилита on позволяет запустить процесс с заданным приоритетом и дисциплиной диспечеризации.
Запуск процесса из потока может быть осуществлен с использованием одной из следующих функций:
|
|
system();
семейство функций ехес();
семейство функций spawn();
fork();
vfork().
Какую из этих функций применять, зависит от двух требований: переносимости и функциональности.
Обычно при всех запросах на создание нового процесса происходит следующее.
Поток в первоначальном процессе вызывает одну из вышеприведенных функций. В конечном итоге, функция заставит администратор процессов создать адресное пространство для нового процесса. Затем ядро выполнит запуск системного потока в новом процессе. Этот поток выполнит несколько инструкций и вызовет функцию main().
Функция system() получает на вход одну командную строку, такую же, которую набирают в ответ на запрос командного интерпретатора, и выполняет ее. Фактически, для обработки команды, функция system() запускает копию командного интерпретатора.
system(« program1» )
Семейство функций ехес() подменяет текущий процесс другим. Когда процесс вызывает функцию семейства ехес(), этот процесс прекращает выполнение текущей программы (т.е всех потоков, входящих в процесс) и начинает выполнять другую программу. Идентификатор процесса (PID) при этом не меняется, просто процесс преобразуется в другую программу.
Семейство spawn() отличается от семейства функций ехес() тем, что вызов функции семейства spawn() создает другой процесс (с новым идентификатором), который соответствует программе, указанной в аргументах функции. Процесс-родитель продолжает выполняться.
В качестве параметров функциям семейств ехес() и spawn() передается полное имя вызываемой программы и, при необходимости, опции ее выполнения (аргументы функции main()).
|
|
Функция fork() создает новый процесс, копируя текущий процесс. У созданного процесса как код, так и данные полностью совпадают с кодом и данными родительского процесса. Дочерний процесс, будет стартовать с команды, следующей непосредственно за вызовом функции fork(). Однако между этими двумя процессами будет иметь место ряд различий, в частности этих двух процессов будут отличаться pid и ppid, а ppid у дочернего процесса будет равен pid процесса-родителя, функции fork() в родительский процесс вернет pid процесса-потомка, а в процесс потомок 0.
Т.е. фрагмент программы: