что происходит на нижних уровнях после системного вызова fork? - PullRequest
6 голосов
/ 05 февраля 2010

Я знаю, что делает fork () на более высоком уровне. То, что я хотел бы знать, это -

  1. Как только происходит вызов вилки, следует инструкция прерывания, и управление переходит к выполнению «обработчика» вилки. Теперь, как этот обработчик, который создает дочерний процесс путем дублирования родительского процесса путем создания другого адресного пространства и блока управления процессом, возвращает 2 значения, по одному для каждого процесса?

  2. В какой момент выполнения вилка возвращает 2 значения?

Короче, кто-нибудь может объяснить, пожалуйста, пошаговые события, которые происходят на нижнем уровне после вызова вилки?

Ответы [ 2 ]

1 голос
/ 05 февраля 2010

Значение, возвращаемое каждому процессу, отличается. Родительский / исходный поток get получает PID дочернего процесса, а дочерний процесс get получает 0.

Ядро Linux достигает этого на x86, изменяя значение в регистре eax, поскольку оно копирует текущий поток в родительский процесс.

1 голос
/ 05 февраля 2010

Это не так сложно, правда - половина ядра системного вызова fork () может показать разницу между двумя процессами через блок управления процессами, как вы упомянули, но вам даже не нужно этого делать. Таким образом, псевдокод выглядит так:

int fork()
{
    int orig_pid = getpid();

    int new_pid = kernel_do_fork();     // Now there's two processes

    // Remember, orig_pid is the same in both procs
    if (orig_pid == getpid()) {
        return new_pid;
    }

    // Must be the child
    return 0;
}

Edit: Наивная версия работает так же, как вы описываете - она ​​создает новый контекст процесса, копирует все связанные контексты потока, копирует все страницы и сопоставления файлов, и новый процесс помещается в список «готов к запуску».

Я думаю, что часть, из-за которой вы запутались, заключается в том, что когда эти процессы возобновляются (то есть, когда родитель возвращается из kernel_do_fork, а потом запланирован первый раз), он начинается в middle функции (т.е. выполнение этого первого «если»). Это точная копия - оба процесса выполнят вторую половину функции.

...