Автор: 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
Невозможно предсказать, какая из надписей появится первой - та, которая выводится родительским процессом или та, которая выводится дочерним. Запустите программу несколько раз и вы увидите, что в появлении надписей нет единого порядка. Действительно - для ядра системы эти две ветки стали различными процессами и порядок их выполнения уже на совести менеджера процессов.