что происходит на более низких уровнях после системного вызова fork?

StackOverflow https://stackoverflow.com/questions/2205224

  •  18-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

Это не так уж сложно, верно - половина ядра системного вызова 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;
}

Редактировать: Наивная версия выполняет именно то, что вы описали - она создает новый контекст процесса, копирует все связанные контексты потоков, копирует все страницы и сопоставления файлов, и новый процесс помещается в список "готов к запуску".

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top