面试题答案
一键面试fork 函数创建新进程原理
在 Unix 及类 Unix 系统(C++ 可调用系统 API)中,fork
函数用于创建一个新进程,称为子进程。fork
函数会复制调用它的进程(父进程),生成一个几乎完全一样的子进程。具体原理如下:
- 内核操作:内核为子进程分配新的进程控制块(PCB),该控制块包含了进程相关的所有信息,如进程 ID、状态、寄存器值等。
- 内存复制:子进程获得与父进程几乎相同的地址空间副本。这意味着子进程拥有与父进程相同的代码段、数据段、堆和栈。不过现代操作系统通常采用写时复制(Copy - on - Write,COW)技术,只有当父进程或子进程试图修改内存时,才会真正复制对应的内存页,以提高效率和节省内存。
- 返回值:
fork
函数在父进程和子进程中都有返回。在父进程中,返回值是子进程的进程 ID;在子进程中,返回值是 0。通过这个返回值,父进程和子进程可以区分彼此并执行不同的代码逻辑。
代码示例
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid = fork();
if (pid < 0) {
std::cerr << "fork() failed" << std::endl;
return 1;
} else if (pid == 0) {
// 子进程
std::cout << "I am the child process, my PID is " << getpid() << std::endl;
} else {
// 父进程
std::cout << "I am the parent process, my PID is " << getpid() << ", and my child's PID is " << pid << std::endl;
}
return 0;
}