Запуск процесса

Запуск процесса может быть осуществлен из командного интерпретатора либо из любого потока с учетом ограничений вытекающих из основных принципов защиты (правила доступа к файлу, ограничения на привилегии и т. д.).

Для запуска процесса из командного интерпретатора необходимо ввести командную строку:

$ 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.

Т.е. фрагмент программы:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: