417 字
2 分钟
CSAPP 第八章 - 异常控制流

第八章 异常控制流#

1. 什么是异常控制流#

异常控制流是指程序运行过程中非顺序的控制流转移,由以下几种机制产生

  1. 异常::由硬件或操作系统触发,控制用户进程跳转到内核

中断: 外部设备,异步触发

​ **陷阱:**有意请求操作系统,同步触发

​ **故障:**程序出错,可能可恢复,同步触发

​ **终止:**程序出错,不可恢复,同步触发

  1. **信号:**程序间的通信,异步事件通知
  2. **进程切换:**上下文切换
  3. **非本地跳转:**例如setjump/longjump

2. 进程#

进程是正在运行的程序,拥有私有地址空间,包括:

  1. 文本段(代码)
  2. 数据段(已初始化、未初始化)
  3. 栈(函数调用栈)
  4. 文件描述符表
  5. 信号处理上下文

创建进程:

pid_t pid = fork(); // 创建子进程,复制当前进程
// 返回值含义
pid == 0 // 子进程
pid > 0 // 父进程,返回子进程PID
pid < 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. 信号#

信号是由内核或者其它进程发送给进程的“消息”,用于通知异步事件

常见的信号:

  1. SIGINT: 默认行为终止,来源于ctrl + C
CSAPP 第八章 - 异常控制流
https://mizuki.mysqil.com/posts/csapp/第八章-异常控制流/
作者
Elopez
发布于
2025-11-05
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00