进程和 fork() 方法

进程和 fork() 方法

我是操作系统和 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();
}

语句ABC将由越来越多的进程执行(实际上不要编写这样的代码,它可能会导致您的系统锁定)。

在您的示例中,这些指令也将由子进程执行,但没有返回这些指令的代码路径。子进程由于在调用 时与父进程相同fork(),因此将在调用 的代码中开始执行fork()

相关内容