417 字
2 分钟
CSAPP 第八章 - 异常控制流
第八章 异常控制流
1. 什么是异常控制流
异常控制流是指程序运行过程中非顺序的控制流转移,由以下几种机制产生
- 异常::由硬件或操作系统触发,控制用户进程跳转到内核
中断: 外部设备,异步触发
**陷阱:**有意请求操作系统,同步触发
**故障:**程序出错,可能可恢复,同步触发
**终止:**程序出错,不可恢复,同步触发
- **信号:**程序间的通信,异步事件通知
- **进程切换:**上下文切换
- **非本地跳转:**例如
setjump/longjump
2. 进程
进程是正在运行的程序,拥有私有地址空间,包括:
- 文本段(代码)
- 数据段(已初始化、未初始化)
- 栈(函数调用栈)
- 文件描述符表
- 信号处理上下文
创建进程:
pid_t pid = fork(); // 创建子进程,复制当前进程
// 返回值含义pid == 0 // 子进程pid > 0 // 父进程,返回子进程PIDpid < 0 // 出错3. 程序替换
int execve(const char *filename, const char *argv[], const char*envp[]);用新程序替换当前进程的内存映像
不会返回,除非出错
保留:PID不变,文件描符不变,信号上下文保留
4. 回收子进程
pid_t wait(int *status);pid_t wait_pid(pid_t pid, int *status, int options);回收子进程,避免僵尸进程
waitpid支持非阻塞(WNOHANG)和特定子进程
5. 信号
信号是由内核或者其它进程发送给进程的“消息”,用于通知异步事件
常见的信号:
- SIGINT: 默认行为终止,来源于ctrl + C
CSAPP 第八章 - 异常控制流
https://mizuki.mysqil.com/posts/csapp/第八章-异常控制流/ 部分信息可能已经过时