返回

揭秘父子进程之间的奥秘:异同探究

见解分享

一个进程 是一个计算机程序正在执行的一个实例。它是一个独立的实体,拥有自己的内存空间、代码和数据。当一个进程创建一个新进程时,这个新进程被称为子进程 ,而原进程被称为父进程

fork 之后,父子进程之间有许多相同和不同的方面。

相同之处:

  • 全局变量、.data 和 .text 段: 这些段在父进程和子进程之间共享。
  • 栈: 每个进程都有自己的栈,用于存储局部变量和函数调用信息。
  • 堆: 父进程和子进程共享同一堆空间,用于动态内存分配。
  • 环境变量、用户 ID、宿主目录、进程工作目录和信号处理方式: 这些属性在父子进程之间都是相同的。

不同之处:

  • 进程 ID: 每个进程都有一个唯一的进程 ID,用于识别它。
  • fork 返回值: 在父进程中,fork 返回子进程的进程 ID。在子进程中,fork 返回 0。
  • 父进程 ID: 子进程有父进程的进程 ID。
  • 打开文件符: 默认情况下,父进程和子进程共享打开的文件符。但是,可以使用 dup2() 系统调用来创建文件描述符的独立副本。

示例:

以下是一个简单的 C 程序,演示了父进程和子进程之间的相同和不同之处:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    int x = 10;  // 全局变量

    pid_t pid = fork();

    if (pid == 0) {
        // 子进程
        printf("子进程:\n");
        printf("  进程 ID:%d\n", getpid());
        printf("  父进程 ID:%d\n", getppid());
        printf("  全局变量 x:%d\n", x);
    } else {
        // 父进程
        printf("父进程:\n");
        printf("  进程 ID:%d\n", getpid());
        printf("  父进程 ID:%d\n", getppid());
        printf("  全局变量 x:%d\n", x);
        wait(NULL);  // 等待子进程终止
    }

    return 0;
}

程序输出:

父进程:
  进程 ID:1234
  父进程 ID:1233
  全局变量 x10
子进程:
  进程 ID:1235
  父进程 ID:1234
  全局变量 x10

从输出中可以看到,父进程和子进程共享全局变量 x,但具有不同的进程 ID 和父进程 ID。