【发布时间】:2014-01-27 17:19:15
【问题描述】:
当 fork() 系统调用被执行时,处理器进入内核模式。
因此,在 fork 调用结束时,产生了一个新进程,其中包含调用进程的几乎所有构造(如堆栈、用户数据和用户程序等)的副本。
从许多得到很好回答的解释中也可以清楚地看出,进程(程序员)如何识别子进程和父进程之间的区别。根据 SO 和其他地方的许多记录在案的答案:
如果对fork() 的调用返回0,这意味着它是调用fork() 的子进程。而如果
fork()的返回值为正整数,则表示fork()是在父进程中执行的,返回的正整数是子进程的PID。为简洁起见,忽略返回负值的情况。
希望我上面的理解是正确的:fingers_crossed:
但是,以下是我试图更好地理解并希望更详细/深入的内容:
(请原谅我对这个主题的无知。我只是想从内部角度更好地理解这一点。这个主题以及我想要更清楚地了解它的想法现在已经开始劫持我的梦想:P)
系统调用(当 fork() 被调用时被调用)如何知道现在它正在作为子进程的一部分执行因此应该返回0?
或者说,系统调用如何知道它正在父进程的上下文中执行因此它现在应该返回子进程的 PID 而不是 0? p>
或者是这样的,在这两个进程中,由于两个都是精确的副本,其中一个随机将返回值作为 0,另一个作为 PID然后根据哪个得到什么返回值,它被认为是父母和孩子? :thinking_face:
我很乐意在我应该通过的任何资源的方向上得到指导。我真的很感激在这个方向上的任何帮助。 :祈祷:
【问题讨论】:
-
请花几个小时阅读Advanced Linux Programming,它很好地解释了这个棘手的问题。另请阅读fork syscall 上的维基页面。我们没有时间在这里教你。
-
一个提示。查看进程 ID (PID)。父进程维护原始 PID,而子进程接收新的 PID。另外,前者被设置为后者的父PID。
-
fork()被调用一次,但最终在两个不同的进程中返回两次。 O/S 负责确保发生这种情况;它会创建流程的副本并确保两个返回正确发生。 -
当 fork 复制当前进程时,它不是一个精确副本。不同之处之一是 fork() 返回的值。
标签: linux process operating-system fork exec