返回
揭秘父子进程之间的奥秘:异同探究
见解分享
2023-09-03 03:26:33
一个进程 是一个计算机程序正在执行的一个实例。它是一个独立的实体,拥有自己的内存空间、代码和数据。当一个进程创建一个新进程时,这个新进程被称为子进程 ,而原进程被称为父进程 。
在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
全局变量 x:10
子进程:
进程 ID:1235
父进程 ID:1234
全局变量 x:10
从输出中可以看到,父进程和子进程共享全局变量 x
,但具有不同的进程 ID 和父进程 ID。