2014-01-27 4 views
1

Когда выполняется системный вызов fork(), процессор переходит в режим ядра. Таким образом, в конце вызова fork появился новый процесс с копией стека, пользовательскими данными и пользовательскими программами. Итак, как развивается fork в это время, если в дочернем процессе он возвращает 0 и если это основной родительский процесс, тогда он должен возвращать PID дочернего процесса.Как fork() знает, находится ли он в дочернем процессе и в родительском процессе?

Является ли fork() дважды? Пожалуйста, объясните. Я смущен !!!

+1

Прочтите несколько часов, чтобы прочитать [Advanced Linux Programming] (http://advancedlinuxprogramming.com/), который очень хорошо объясняет этот сложный вопрос. Также прочитайте wikipage на [fork syscall] (http://en.wikipedia.org/wiki/Fork_%28system_call%29). У нас нет времени, чтобы научить вас этому. –

+0

Один намек. Посмотрите идентификаторы процессов (PID). Родитель поддерживает исходный PID, пока ребенок получает новый PID. Кроме того, первый настраивается как родительский PID более позднего. – DoxyLover

+0

'fork()' вызывается один раз, но заканчивается дважды, в двух разных процессах. O/S несет ответственность за обеспечение этого; он создает копию процесса и гарантирует, что два возвращения будут выполнены правильно. –

ответ

5

Когда вызывается 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() возвращает разные значения для родительских или дочерних процессов.

+0

Я думаю, он спрашивает, как вилка знает, что вернуть. Не так, как вы можете сказать, основываясь на возвращаемом значении fork. – asbumste

+0

Для меня его вопрос указывал на общую путаницу в отношении использования forking, что вполне понятно, учитывая его отклонение от типичной однопоточной модели исполнения. Я понял, что демонстрация будет более ясной, чем отправка ему технических справок. – millinon

+0

Да, точно, как fork() знает, что возвращать в дочерних и родительских процессах ??? – user3111412

Смежные вопросы