进程
printf 缓冲区

-
缓冲区不立即输出,满足以下条件才刷新:
-
缓冲区满
-
强制刷新
-
进程结束
-
-
换行符
\n会自动刷新缓冲区。
进程退出函数
| 函数 | 头文件 | 特点 | 适用场景 |
|---|---|---|---|
| exit() | stdlib.h | 先清理资源、刷新缓冲区,再退出 | 单进程、普通程序 |
| _exit() | unistd.h | 直接内核退出,不刷新缓冲区 | 子进程、多进程 |
Exit()终止逻辑:
先执行用户态的资源清理操作,在调用内核实现终止逻辑
-
刷新并关闭标准I/O流(强制刷新缓冲区的数据(加了\n)时,缓冲区内容会被输出到终端或文件中)
-
清理私有资源,释放进程占用的用户态内存(堆内存,全局变量内存)
-
调用 _exit() 触发内核回收
_Exit()终止逻辑:
是系统调用,会跳过用户态的所有操作,直接通知内核终止进程
普通单进程程序:优先使用exit()
多进程例如父子进程() 子进程优先使用_exit();
main 函数参数
int main(int argc, char *argv[], char *envp[])
-
argc:参数个数
-
argv:参数内容数组
-
envp:系统环境变量数组
程序 vs 进程
-
程序:静态代码文件,不占运行资源
-
进程:程序的动态执行过程,占用 CPU / 内存
fork () 创建子进程
-
头文件:
#include <unistd.h> -
返回值:
-
父进程:返回子进程 PID
-
子进程:返回0
-
创建失败:返回 -1(比如内存不足,系统进程数达到上限),设置error表示错误原因(perror查看出错原因)
-
-
特点:调用一次,返回两次,父子进程代码相同、数据独立。
僵死进程 & 孤儿进程
-
僵死进程
子进程先结束,父进程未回收资源,子进程变为僵尸(占用 PCB)。
-
孤儿进程
父进程先结束,子进程被
系统 init/systemd
收养,不会僵尸。
进程三状态
-
运行态:正在占用 CPU
-
就绪态:准备好,等待 CPU
-
阻塞态:等待资源 / 事件,暂时不参与调度
wait () 函数
- 作用:阻塞父进程 ,等待并回收子进程资源,防止僵尸进程。
写时拷贝
-
核心定义
写时拷贝 (Copy-On-Write,COW):延迟拷贝,只有在真正修改内存页时才执行拷贝,未修改页全程共享,是高效的内存共享与复制策略。
-
为什么需要 COW
-
不使用 COW:
fork()会全量复制父进程代码段、数据段、栈、堆,严重浪费 CPU 与内存带宽。 -
使用 COW:父子进程先共享同一块物理内存,仅修改时才拷贝,避免无效复制。
- 核心规则
-
读:共享内存,不拷贝。
-
写:触发拷贝,分配新物理页,各自独立。