第八章 异常控制流
一、学习目标
- 了解异常及其种类
- 理解进程和并发的概念
- 掌握进程创建和控制的系统调用及函数使用:fork,exec,wait,waitpid,exit,getpid,getppid,sleep,pause,setenv,unsetenv,
- 理解数组指针、指针数组、函数指针、指针函数的区别
- 理解信号机制:kill,alarm,signal,sigaction
- 掌握管道和I/O重定向:pipe, dup, dup2
二、学习任务
- 注意每个系统调用的参数、返回值,会查帮助文档
- 阅读教材,完成课后练习(书中有参考答案),考核:练习题把数据变换一下
- 学习视频,掌握两个重要命令:
- man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
- grep -nr XXX /usr/include :查找宏定义,类型定义
三、教材学习
(1)异常的类别
类别 | 原因 | 异步/同步 | 返回行为 |
---|---|---|---|
中断 | 来自I/O设备的信号 | 异步 | 总是返回到下一条指令 |
陷进 | 有意的异常 | 同步 | 总是返回到下一条指令 |
故障 | 潜在可恢复的错误 | 同步 | 可能返回到当前指令 |
终止 | 不可恢复的错误 | 同步 | 不会返回 |
- 中断是异步发生的,是来自处理器外部的 I/O 设备的信号的结果,中断处理程序将控制返回到下一条指令。除了它,其他异常均为同步发生,叫做故障指令(fault instruction)。
- 陷阱是有意的异常,是执行一条指令的结果,陷阱处理程序将控制返回到下一条指令,它最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用。
- 故障是由错误情况引起,它可能能够被故障处理程序修正。如果故障修理成功,则返回原指令,否则终止程序。
- 终止是不可恢复的致命错误造成的后果,通常是一些硬件错误,具有终止应用程序的能力。
(2)进程
- 进程:经典定义就是一个执行中程序的实例。
- 上下文:由程序正确运行所需的状态组成的。这个状态包括存放在内存中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。
- 进程提供给应用程序的关键抽象:
进程提供 | 假象 |
---|---|
独立的逻辑控制流 | 提供程序独占处理机的假象 |
私有的地址空间 | 提供程序独占内存系统的假象 |
- 地址空间底部是保留给用户程序的,包括通常的代码、数据、堆和栈段。代码段总是从地址0x400000开始。
- 当设置了模式位时,进程就运行在内核模式中(超级用户模式),一个运行在内核模式的进程可以执行指令集中的任何指令,并且可以访问系统中的任何内存位置。
- 在内核调度了一个新的进程运行后,它就抢占当前进程,并使用一种称为上下文切换的机制来将控制转移到新的进程。
- 上下文切换:保存当前进程的上下文;恢复某个先前被抢占的进程被保存的上下文;将控制传递给这个新恢复的进程。
- 引起上下文切换:调度(由调度器处代码实现);中断(内核判定)
(3)进程控制
- 获取进程ID(PID)
- getpid函数:返回调用进程的PID
- getppid函数:返回它的父进程的PID(创建调用进程的进程)
- 进程状态(程序员角度)
- 运行:CPU上运行 or 等待被执行且最终会被内核调度
- 停止:收到SIGSTOP、SIGTTIN、SIGTTOU信号时停止并挂起,直到收到SIGCONT信号时再次运行
- 终止:终止原因 1)收到默认行为是终止进程的信号 2)从主程序返回 3)调用exit函数
- 创建进程:父进程通过调用 fork 函数创建一个新的运行的子进程。
- 新创建的子进程几乎但不完全与父进程相同。子进程相当于从 fork() 函数继续执行。但是子进程和父进程有不同的 PID,这也是它们最大的区别。
- 在父进程中,fork 返回子进程的 PID。在子进程中,fork 返回 0。子进程的 PID 总是为非零。
- 一个进程可以通过调用 waitpid 函数来等待它的子进程终止或者停止,waitpid 返回导致 waitpid 返回已终止子进程的 PID。
- execve 函数在当前进程的上下文中加载并运行一个新程序。
- fork函数:调用一次,返回两次。并发执行。相同但是独立的地址空间。共享文件。
四、课堂学习
(1)man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
(2)grep -nr XXX /usr/include :查找宏定义,类型定义
- 参考资料:linux grep命令详解
五、课堂测试补交
参考伪代码实现ls的功能,提交代码的编译,运行结果截图,码云代码链接。
打开目录文件
针对目录文件
读取目录条目
显示文件名
关闭文件目录文件
- 代码连接:码云 ls.c
- 实现截图: