Rambler's
Top100

Разветвление процесса с помощью системного вызова fork

Автор: lonesome TSH/Digital Daemons
Дата: .03.2003
Раздел: Низкоуровневое программирование в Linux

Ядро Linux предоставляет системный вызов #2 fork для "ветвления" процесса. Этот системный вызов создает дочерний процесс, который отличается от создавшего его только идентификатором процесса. Дочерний процесс получает память родительского, причем используется метод COW - copy on write (копирование при записи), т.е. память действительно копируется только тогда, когда в нее производится запись, а до этого таблицы страниц обеих процессов указывают на одну и ту же область памяти

Как программе отличить в каком из процессов она выполняется? Очень просто: родительскому процессу fork возвращает PID дочернего, а дочернему возвращает 0.

Рассмотрим программу, которая разветвится на две части с помощью системного вызова fork. Одна из частей получит управление в родительском процессе, вторая - в дочернем

global _start

_start:

;Системный вызов #2 fork:
mov eax, 2
int 0x80

;Проверка возвращаемого значения
test eax, eax
;Если ноль - то это дочерний процесс:
jz child

;Иначе - это родительский процесс:
mov eax, 4
mov ebx, 1
mov ecx, msg1
mov edx, msg1len
int 0x80

jmp short quit
child:
mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, msg2len
int 0x80

quit:
mov eax, 1
int 0x80

section .data
msg1: db "I am the parent process",0x0A
msg1len equ $-msg1
msg2: db "I am the child process",0x0A
msg2len equ $-msg2

Невозможно предсказать, какая из надписей появится первой - та, которая выводится родительским процессом или та, которая выводится дочерним. Запустите программу несколько раз и вы увидите, что в появлении надписей нет единого порядка. Действительно - для ядра системы эти две ветки стали различными процессами и порядок их выполнения уже на совести менеджера процессов.



Rambler's Top100