MST

星途 面试题库

面试题:C++ 中使用 fork 函数创建新进程的原理及代码实现

在 C++ 中,简述使用 fork 函数创建新进程的原理,并给出一段使用 fork 函数创建新进程,且父进程和子进程分别输出不同信息的代码示例。
10.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

fork 函数创建新进程原理

在 Unix 及类 Unix 系统(C++ 可调用系统 API)中,fork 函数用于创建一个新进程,称为子进程。fork 函数会复制调用它的进程(父进程),生成一个几乎完全一样的子进程。具体原理如下:

  1. 内核操作:内核为子进程分配新的进程控制块(PCB),该控制块包含了进程相关的所有信息,如进程 ID、状态、寄存器值等。
  2. 内存复制:子进程获得与父进程几乎相同的地址空间副本。这意味着子进程拥有与父进程相同的代码段、数据段、堆和栈。不过现代操作系统通常采用写时复制(Copy - on - Write,COW)技术,只有当父进程或子进程试图修改内存时,才会真正复制对应的内存页,以提高效率和节省内存。
  3. 返回值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;
}