Разветвление процесса с помощью системного вызова 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