父进程与子进程关系
在UNIX和类UNIX操作系统中,fork
是一个系统调用,它用于创建一个新进程,这个新进程被称为子进程。子进程是父进程的一个副本,它继承了父进程的许多属性,例如打开的文件描述符、信号处理设置等,但是它有自己的唯一进程ID(PID)和内存空间。
fork
函数的原型如下:
pid_t fork(void);
当 fork
被调用时,它会返回两次:
- 在父进程中,
fork
返回子进程的PID。 - 在子进程中,
fork
返回0。 - 如果
fork
失败,它返回-1,并设置errno
来指示错误原因。
fork
调用成功后,操作系统会创建一个新的进程表项,并将父进程的许多属性复制到子进程中。这包括:
- 父进程的内存映像,包括代码段、数据段、堆栈段等。
- 父进程的打开文件描述符表。
- 父进程的信号处理设置。
- 父进程的当前工作目录。
- 父进程的环境变量。
但是,子进程有一些自己的独立属性,例如: - 它有自己的唯一的PID。
- 它的父进程PID(PPID)是原父进程的PID。
- 它有自己的独立的内存空间,虽然最初与父进程相同。
- 它有自己的程序计数器(PC),用于跟踪下一条要执行的指令。
fork
是UNIX操作系统中“一切皆文件”哲学的体现,它允许进程通过复制自己的方式来创建新进程,这是进程控制的基础。
示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
pid_t pid = fork(