gpt4 book ai didi

c - fork 实现

转载 作者:太空狗 更新时间:2023-10-29 16:51:55 26 4
gpt4 key购买 nike

fork系统调用代码是怎么写的。我想知道一个函数如何返回两个不同的值并将其返回到两个不同的进程的一些细节。总之想知道fork系统调用是如何实现的?

最佳答案

Carl 的回答很棒。我想补充一点,在许多操作系统中,返回值是在其中一个寄存器中传递的。在 x86 架构中这个寄存器可能是 eax,在 ARM 架构中这个寄存器可能是 R0 等。

每个进程还有一个进程控制 block (PCB),它存储在某些中断、系统调用或异常发生时的寄存器值,并将控制权传递给操作系统。下一次进程调度时,寄存器的值从 PCB 恢复。

现在,当发生 fork() 时,操作系统可以:

 child_process->PCB[return_value_register] = 0;
parrent_process->PCB[return_value_register] = child_pid;

因此,当重新安排流程时,每个流程都会看到不同的返回值。

例如,您可以看到 xv6's implementation of fork .在那里,父进程仍处于运行状态,因此它使用简单的 return 语句返回父进程的返回值。但它会将子进程的 EAX 寄存器的值设置为 0,因此当子进程被调度时,它会将 0 视为返回值:

// Clear %eax so that fork returns 0 in the child.
np->tf->eax = 0;

请注意,返回 0 也会编译为类似“mov eax, 0”的内容。

更新:我刚刚为我正在做的一个业余操作系统实现了 fork()。可以看源码here .

关于c - fork 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com