我知道fork()对于子进程和父进程返回的结果有所不同,但是我无法找到有关此情况的信息。子进程如何从fork接收返回值0?在调用堆栈方面有什么区别?据我了解,对于父母来说,是这样的:
父进程-调用fork-> system_call-调用fork-> fork执行-返回-> system_call-返回->父进程。
在子进程中会发生什么?
%人叉
返回值 Upon successful completion, fork() returns a value of 0 to the child process and returns the process ID of the child process to the parent process. Otherwise, a value of -1 is returned to the parent process, no child process is created, and the global variable [errno][1] is set to indi- cate the error.
返回值
Upon successful completion, fork() returns a value of 0 to the child process and returns the process ID of the child process to the parent process. Otherwise, a value of -1 is returned to the parent process, no child process is created, and the global variable [errno][1] is set to
indi- cate the error.
发生的事情是在fork系统调用中,整个过程重复了。然后,每个调用中的fork调用都会返回。但是,这些现在是不同的上下文,因此它们可以返回不同的返回码。
如果您真的想知道它的工作原理,可以随时检查源代码!如果您不习惯阅读内核代码,则代码会有些混乱,但是内联注释可以很好地提示正在发生的事情。
源代码中最有趣的部分是您的问题的明确答案,它位于fork()定义本身的末尾-
if (error == 0) { td->td_retval[0] = p2->p_pid; td->td_retval[1] = 0; }
“ td”显然拥有一个不同线程的返回值列表。我不确定这种机制的工作原理(为什么没有两个单独的“线程”结构)。如果错误(从fork1返回,“真实”派生函数返回)为0(无错误),则采用“第一个”(父)线程并将其返回值设置为p2(新进程)的PID。如果它是“第二个”线程(在p2中),则将返回值设置为0。