Когда вызывается fork()
, процесс порождает дочерний процесс с общими или дублированными сегментами процесса. Это означает, что в программе, до вызова fork()
, существует только один процесс или одна единица исполнения. После возврата fork()
выполняется два процесса, выполняющихся одновременно. Поскольку оба процесса имеют тот же стек вызовов в этот момент, он смотрит на каждый процесс, как будто он только что вызвал fork()
. В родительском процессе возвращаемое значение fork()
является PID дочернего процесса. В дочернем процессе, возвращаемое значение fork()
0.
Вы можете увидеть это с очень простой демонстрацией:
#include <unistd.h>
#include <stdio.h>
int main(){
pid_t parent = getpid();
pid_t child = fork();
if(child != 0){
printf("I am the parent process. My PID is %d\n", parent);
printf("Parent process terminating\n");
}
else{
printf("I am the child process. My PID is %d\n", getpid());
printf(" My parent's PID is %d\n", parent);
printf("Child process terminating\n");
}
return 0;
}
Вот пример запуск на моем ноутбуке:
$ gcc -o fork fork.c
$ ./fork
I am the parent process. My PID is 16048
Parent process terminating
I am the child process. My PID is 16049
My parent's PID is 16048
Child process terminating
$
Примечания что когда вы запустите это, PID будут разными. Кроме того, выход подлежит состояние гонки, так что иногда, родительский процесс возвращается к оболочке, прежде чем процесс ребенок закончил печать, так что это может выглядеть следующим образом:
$ ./fork
I am the parent process. My PID is 16265
Parent process terminating
$ I am the child process. My PID is 16266
My parent's PID is 16265
Child process terminating
Что важно понять, что fork()
приводит к тому, что единый процесс выполнения разбивается на две независимые единицы. Поскольку каждый процесс все еще порожден из одной и той же программы (или исходного кода), поведение для обоих процессов одинаково. Причина, по которой их выход отличается, заключается только в том, что fork()
возвращает разные значения для родительских или дочерних процессов.
Прочтите несколько часов, чтобы прочитать [Advanced Linux Programming] (http://advancedlinuxprogramming.com/), который очень хорошо объясняет этот сложный вопрос. Также прочитайте wikipage на [fork syscall] (http://en.wikipedia.org/wiki/Fork_%28system_call%29). У нас нет времени, чтобы научить вас этому. –
Один намек. Посмотрите идентификаторы процессов (PID). Родитель поддерживает исходный PID, пока ребенок получает новый PID. Кроме того, первый настраивается как родительский PID более позднего. – DoxyLover
'fork()' вызывается один раз, но заканчивается дважды, в двух разных процессах. O/S несет ответственность за обеспечение этого; он создает копию процесса и гарантирует, что два возвращения будут выполнены правильно. –