如何编写fork系统调用代码。我想知道一些细节,一个函数如何返回两个不同的值,以及返回给两个不同的进程。简而言之,想知道fork系统调用是如何实现的吗?
发布于 2014-08-21 23:07:24
卡尔的回答很棒。我想补充的是,在许多操作系统中,返回值都是在其中一个寄存器中传递的。在x86体系结构中,该寄存器可以是eax,在ARM体系结构中,该寄存器可以是R0,等等。
每个进程也有一个进程控制块(PCB),它在某些中断、系统调用或异常发生时存储寄存器的值,并将控制传递给操作系统。下一次调度进程时,寄存器的值将从PCB恢复。
现在,当fork()发生时,OS可以执行以下操作:
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。
发布于 2012-01-14 06:05:42
您已经很好地解释了它,说它是一个系统调用。操作系统的工作是完成所有这些工作,并且操作系统几乎可以在您的程序上下文或实现它的任何语言的规则之外做它想做的任何事情。这里有一个简单的例子来说明它是如何发生的:
fork()系统调用发布于 2012-01-14 06:25:40
Ken Thompson和Dennis Ritchie自己注释的大学Unix V6源代码手册中有一条注释,描述了双倍返回实际上是如何工作的。评论以下面的一句话结束:
你不需要理解这一点。
https://stackoverflow.com/questions/8857830
复制相似问题