首页
学习
活动
专区
圈层
工具
发布

Fork实现
EN

Stack Overflow用户
提问于 2012-01-14 06:02:02
回答 4查看 14.6K关注 0票数 10

如何编写fork系统调用代码。我想知道一些细节,一个函数如何返回两个不同的值,以及返回给两个不同的进程。简而言之,想知道fork系统调用是如何实现的吗?

EN

回答 4

Stack Overflow用户

发布于 2014-08-21 23:07:24

卡尔的回答很棒。我想补充的是,在许多操作系统中,返回值都是在其中一个寄存器中传递的。在x86体系结构中,该寄存器可以是eax,在ARM体系结构中,该寄存器可以是R0,等等。

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

现在,当fork()发生时,OS可以执行以下操作:

代码语言:javascript
复制
 child_process->PCB[return_value_register] = 0;
 parrent_process->PCB[return_value_register] = child_pid;

因此,当进程被重新调度时,它们中的每个进程都会看到不同的返回值。

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

代码语言:javascript
复制
// Clear %eax so that fork returns 0 in the child.
np->tf->eax = 0;

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

fork更新:我只是为我正在做的一个业余爱好操作系统实现了()。您可以查看源代码here

票数 13
EN

Stack Overflow用户

发布于 2012-01-14 06:05:42

您已经很好地解释了它,说它是一个系统调用。操作系统的工作是完成所有这些工作,并且操作系统几乎可以在您的程序上下文或实现它的任何语言的规则之外做它想做的任何事情。这里有一个简单的例子来说明它是如何发生的:

  1. 程序调用fork()系统调用
  2. 内核fork系统调用复制运行程序的进程
  3. 内核为原始程序和复制程序设置系统调用的返回值(复制和0的PID,内核将这两个进程放入调度程序队列
    1. 随着每个进程的调度,内核将返回给这两个程序中的每一个。
票数 10
EN

Stack Overflow用户

发布于 2012-01-14 06:25:40

Ken Thompson和Dennis Ritchie自己注释的大学Unix V6源代码手册中有一条注释,描述了双倍返回实际上是如何工作的。评论以下面的一句话结束:

你不需要理解这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8857830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档