fork
- системный вызов, то есть библиотечная подпрограмма, которая вызывает ядро.При обслуживании вызова fork
ядро создает новый процесс, который выполняет ту же программу, что и процесс, который его вызвал.Новый процесс начинает выполняться так, как если бы он вызвал fork
;возвращаемое значение отличается от значения в родительском элементе, поэтому вы можете различать их.
Общая идиома для вызова fork
:
pid_t pid = fork();
switch (pid) {
case -1:
/* an error occurred, i.e. no child process created */
handle_error();
case 0:
/* a return value of 0 means we're in the child process */
do_child_stuff();
break; // or _exit()
default:
/* we're in the parent; pid is the child's process id */
do_parent_stuff();
}
Как это работает так: ОС делает почти идеальную копию процесса, вызывающего fork
(PID и некоторые другие значения различаются, но содержимое памяти начинается практически одинаково, и обычно в обоих файлах открываются одни и те же файлы).Копирование обычно выполняется с использованием так называемой семантики копирования при записи (COW), поэтому копирование практически невозможно, пока один из процессов не начнет присваивать переменные.