我是操作系统和 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之外的所有行。实际上这是我的想法。另一方面,在任何地方,都说子进程是父进程的精确副本。
谁能说出哪一个是真的?
答案1
fork()
“返回两次”。在父进程中,它返回子进程的 PID。在子进程中,它返回零。这是假设没有错误。这意味着您的代码执行两次分叉将产生总共四个进程。
fork(2)
除了( )中描述的方式之外,这些过程在所有方面都是相同的man 2 fork
。
例如,在代码中
while (1) {
A
B
C
fork();
}
语句A
,B
和C
将由越来越多的进程执行(实际上不要编写这样的代码,它可能会导致您的系统锁定)。
在您的示例中,这些指令也将由子进程执行,但没有返回这些指令的代码路径。子进程由于在调用 时与父进程相同fork()
,因此将在调用 的代码中开始执行fork()
。