что происходит на более низких уровнях после системного вызова fork?
-
18-09-2019 - |
Вопрос
Я знаю, что fork() делает на более высоком уровне.Что я хотел бы знать, так это вот что -
Как только происходит вызов fork, следует команда trap, и управление переходит к выполнению "обработчика" fork .Теперь, как этот обработчик , который создает дочерний процесс, дублируя родительский процесс путем создания другого адресного пространства и блока управления процессом, возвращает 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 , поскольку оно копирует текущий поток в родительском процессе.