一、进程创建:fork 函数
1.1 fork 函数初识
在 Linux 中,创建新进程的核心是 fork 函数。它能让一个已存在的进程(父进程)复制出一个全新的进程(子进程),两个进程拥有相同的代码段和数据段(初始状态),但能各自独立运行。
头文件和函数原型如下:
#include <unistd.h>
pid_t fork(void);
fork 函数的特点是一次调用,两次返回。父进程和子进程都会从 fork 函数返回,但返回值不同:
- 子进程中,fork 返回 0;
- 父进程中,fork 返回子进程的 PID;
- 若调用失败,fork 返回 -1。
示例代码(fork_demo.c):
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void) {
pid_t pid;
printf("Before: pid is %d\n", getpid());
if ((pid = fork()) == -1) {
perror("fork() failed");
exit(1);
}
printf("After: pid is %d, fork return %d\n", getpid(), pid);
sleep(1);
return 0;
}
编译执行:
gcc fork_demo.c -o fork_demo
./fork_demo
执行结果中,'Before'只打印一次,'After'打印两次。这是因为 fork 之前只有父进程执行,fork 之后父子进程同时存在。
内核执行步骤包括:分配内存块和 PCB;拷贝数据结构;添加到进程列表;调度器开始调度。
1.2 fork 函数返回值
返回值用于区分父子进程角色:
- 子进程返回 0:标识自己是派生出来的新进程。
- :用于唯一标识和管理子进程。


