我是操作系统和 Linux 的新手,因此这可能是非常基本的问题,但我找不到答案。
根据我目前阅读的资源,该fork()
方法通过生成对操作系统的系统调用来创建新进程。创建的进程是调用进程的精确副本。
但是,我认为创建的进程(子)和调用进程(父)并不完全相同。fork()
父进程中方法之前的代码不会复制到子进程。
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void){
X
int child1 = fork();
A
B
C
D
int child2 = fork();
E
F
return 0;
}
child2 进程不包含代码行 ABCD ,而 child1 进程包含除 X 之外的所有行。实际上这是我的想法。另一方面,在任何地方,都说子进程是父进程的精确副本。
谁能说哪一个是真的?
fork()
“返回两次”。在父进程中,它返回子进程的 PID。在子进程中,它返回零。这是假设没有错误。这意味着您的代码执行两次分叉,总共将产生四个进程。这些过程在所有方面都是相同的,除了
fork(2)
(man 2 fork
) 中描述的方式。例如,在代码中
这些语句
A
,B
并且C
将由越来越多的进程执行(实际上不要编写这样的代码,它可能会导致您的系统锁定)。在您的示例中,指令也将存在以供子进程执行,但没有代码路径可以返回这些指令。由于子进程在调用 时与父进程相同,因此
fork()
将在代码中调用 的位置开始执行fork()
。