Отключение буферизации стандартного потока вывода и вызов fork
15 Мы отключаем буферизацию стандартного потока вывода, поскольку запись в него будет производиться и родительским, и дочерним процессами. Это предотвращает смешивание вывода из двух процессов.
16-29 Родительский и дочерний процессы увеличивают глобальный счетчик в цикле заданное число раз, выполняя операции только при установленном семафоре.
Если мы запустим эту программу на выполнение и посмотрим на результат, обращая внимание только на те строки, где система переключается между родительским и дочерним процессами, мы увидим вот что:
child: 0 дочерний процесс запущен первым,count=О
child; 1
…
child; 678
child: 679
parent: 0 дочерний процесс приостановлен, запускается родительский
процесс и отсчет начинается с О
parent: 1
…
parent: 1220
parent: 1221
child: 680 родительский процесс приостанавливается, начинает
выполняться дочерний процесс
child: 681
…
child: 2078
child: 2079
parent: 1222 дочерний процесс приостанавливается, начинает выполняться
родительский процесс
parent: 1223 и т. д.
Как видно, каждый из процессов использует собственную копию глобального счетчика count. Каждый начинает со значения 0 и при прохождении цикла увеличивает значение своей копии счетчика. На рис. 12.3 изображен родительский процесс перед вызовом fork.
Рис. 12.3. Родительский процесс перед вызовом fork
При вызове fork дочерний процесс запускается с собственной копией данных родительского процесса. На рис. 12.4 изображены оба процесса после возвращения из fork.
Рис. 12.4. Родительский и дочерний процессы после возвращения из fork
Мы видим, что родительский и дочерний процессы используют отдельные копии счетчика count.