在《操作系统概念》一书中我发现了这样一个语境:
在UNIX中,正如我们所看到的,每个进程都由其进程标识符标识,该标识符是一个唯一的整数。fork()系统调用创建了一个新进程。新进程由原始进程地址空间的副本组成。该机制允许父进程与其子进程轻松通信。两个进程(父进程和子进程)都在fork()之后的指令处继续执行,但有一个区别:对于新(子)进程,fork()的返回代码为零,而子进程的(非零)进程标识符被返回给父进程。
我很困惑。听起来像是同一个fork()
函数向父进程和子进程返回两个不同的值?这怎么可能(一个函数向两个进程返回两个不同的值),还是我误解了?
2条答案
按热度按时间g6ll5ycj1#
当输入
fork
时,只有一个进程。在fork
中,这个进程被克隆/复制。现在有两个进程并行运行相同的代码。这两个进程仍然在fork
函数中。最终,每个进程都会退出fork
函数:父进程将退出fork函数(返回子进程的PID),并且子进程将退出fork函数(返回0)。分叉(ASCII艺术):
分叉(剪贴画):
cdmah0mi2#
下面是一些演示该行为的代码:
示例会话:
初始(父)进程(76693)调用
fork()
,这将创建一个新的子进程(76694)。子进程的进程id在父进程的变量p
中返回给父进程。值0
返回到子进程的变量p
中,该变量与父进程的变量p
不同(即使它们具有相同的虚拟地址)。为了更好地衡量,父进程等待子进程退出,并验证我们是否获得了预期的子进程ID。