Создание процессов в Unix

В системах семейства Unix новые процессы создаются системным вызовом fork. Этот вызов создает два процесса, образы которых в первый момент пол­ностью идентичны, у них различается только значение, возвращенное вызовом fork. Типичная программа, использующая этот вызов, выглядит так, как пред­ставлено в примере 3.1.

При этом каждый из процессов имеет свою копию всех локальных и статиче­ских переменных. На процессорах со страничным диспетчером памяти физиче­ского копирования не происходит. Изначально оба процесса используют одни и те же страницы памяти, а дублируются только те из них, которые были измене­ны. На системах, не имеющих страничного или сегментного диспетчера памяти, fork требует копирования адресных пространств, что приводит к большим на­кладным расходам, да и просто не всегда возможно.

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

Несколько неожиданное, но тем не менее верное описание действия exec — это замена образа процесса в рамках того же самого процесса.

Запуск другой программы в UNIX выглядит примерно так, как представлено в примере 3.2.

Программа в примере 3.2 запускает командный интерпретатор /bin/sh, извест­ный как Bourne shell, приказывает ему исполнить команду is -1 иперенаправ­ляет стандартный вывод этой команды в файл ls.log.

Техника программирования, основанная на fork/exec, несколько отличается от принятой во многих других современных системах, в том числе Win32, так при создании нового процесса мы сразу же указываем программу, которую она будет исполнять.

 

 

Но вернемся к способам загрузки программ.