Системное программирование в UNIX средствами Free Pascal

       

В результате успешного вызова fork


uses linux;
Function Fork:Longint;
В результате успешного вызова fork ядро создает новый процесс, который является почти точной копией вызывающего процесса. Другими словами, новый процесс выполняет копию той же программы, что и создавший его процесс, при этом все его объекты данных имеют те же самые значения, что и в вызывающем процессе, за одним важным исключением, которое вскоре обсудим.
Созданный процесс называется дочерним процессом (child process), а процесс, осуществивший вызов fork, называется родителем (parent).
После вызова родительский процесс и его вновь созданный потомок выполняются одновременно, при этом оба процесса продолжают выполнение с оператора, который следует сразу же за вызовом fork.
Идею, заключенную в вызове fork, быть может, достаточно сложно понять тем, кто привык к схеме последовательного программирования. Рис. 5.1 иллюстрирует это понятие. На рисунке рассматриваются три строки кода, состоящие из вызова writeln, за которым следует вызов fork, и еще один вызов
writeln.



writeln('One');
pid:=fork;
writeln('Two');
< PC
A

fork
До
После
writeln('One');
pid:=fork;
writeln('One');
pid:=fork;
writeln('Two');
< PC
writeln('Two');
< PC
A
B

Рис. 5.1. Вызов fork
Рисунок разбит на две части: До и После. Часть рисунка До показывает состояние до вызова fork. Существует единственный процесс A (его обозначили буквой А только для удобства, для системы это ничего не значит). Стрелка, обозначенная PC (program counter – программный счетчик), указывает на выполняемый в настоящий момент оператор. Так как стрелка указывает на первый оператор writeln, на стандартный вывод выдается тривиальное сообщение One.


Часть рисунка После показывает ситуацию сразу же после вызова fork. Теперь существуют два выполняющихся одновременно процесса: А и В. Процесс A – это тот же самый процесс, что и в части рисунка До. Процесс В – это новый процесс, порожденный вызовом fork. Этот процесс является копией процесса A за одним важным исключением – он имеет другое значение идентификатора процесса pid, но выполняет ту же самую программу, что и процесс А, то есть те же три строки исходного кода, приведенные на рисунке. В соответствии с введенной выше терминологией процесс А является родительским процессом, а процесс В – дочерним.
Две стрелки с надписью PC
в этой части рисунка показывают, что следующим оператором, который выполняется родителем и потомком после вызова fork, является вызов writeln. Другими словами, оба процесса А и В
продолжают выполнение с той же точки кода программы, хотя процесс В и является новым процессом для системы. Поэтому сообщение Two выводится дважды.

Содержание раздела