标签:
控制流:控制转移序列。
控制转移:从一条指令到下一条指令。
异常控制流:现代操作系统通过使控制流发生突变来对系统状态做出反应,这些突变称为异常控制流。
作为程序员,理解ECF很重要,这有很多原因:
异常的剖析,如下图所示:
异常的类别——中断、陷阱、故障和终止
Linux/IA32故障和终止
除法错误
一般保护故障
缺页
机器检查
Linux/IA32系统调用
每个系统调用都有一个唯一的整数号,对应于一个到内核中跳转表的偏移量。
程序计数器(PC)值的序列叫做逻辑控制流,简称逻辑流。如下图所示,处理器的一个物理控制流分成了三个逻辑流,每个进程一个。
一个进程为每个程序提供它自己的私有地址空间。
当Unix系统级函数遇到错误时,它们典型地会返回―1,并设置全局整数变量errno来表示什么出错了。程序员应该总是检查错误,但是不幸的是,许多人都忽略了错误检查,因为它使代码变得臃肿,而且难以读懂。比如,下面是我们调用Unix fork函数时会如何检查错误:
通过使用错误处理包装函数,我们可以更进一步地简化我们的代码。对于一个给定的基本函数foo,我们定义一个具有相同参数的包装函数Foo,但是第一个字母大写了。包装函数调用基本函数,检查错误,如果有任何问题就终止。比如,下面是fork函数的错误处理包装函数:
我们将在本书剩余的部分中都使用错误处理包装函数数。它们能够保持代码示例简洁,而又不会给你错误的假象,认为允许忽略错误检查。注意,当在本书中谈到系统级函数时,我们总是用它们的小写字母的基本名字来引用它们,而不是用它们大写的包装函数名来引用!关于Unix错误处理以及本书中使用的错误处理包装函数的讨论,请参见附录A。包装函数定义在一个叫做csapp.c的文件中,它们的原型定义在一个叫做。csapp.h的头文件中。
进程的三种状态——运行、停止和终止。
进程会因为三种原因终止进程:收到信号,该信号默认终止进程;从主程序返回;调用exit函数。
8.4.3 回收子进程495
waitpid函数有点复杂,默认地(当options=0时),waitpid挂起调用进程的执行,知道它的等待集合中的一个子进程终止。
1.判定等待集合的成员
2.修改默认行为
3.检查已回收子进程的退出状态
4.错误条件
5.wait函数
6.使用waitpid的示例
sleep函数将一个进程挂起一段指定的时间。
pause函数让调用函数休眠,直到该进程收到一个信号。
1.进程组
Signal包装函数设置的信号处理程序的信号处理语义:
(1)只有这个处理程序当前正在处理的那种类型的信号被阻塞
(2)和所有信号实现一样,信号不会排队等候
(3)只要有可能,被中断的系统调用会自动重启。
(4)一旦设置了信号处理程序,它就会一直保持,知道signal带着handler参数为SIG_IGN或者SIG_DFL被调用。
8.5.7 同步流以避免讨厌的并发错误517
非本地跳转的一个重要应用就是允许从一个深层嵌套的函数调用中立即返回,通常是由检测到某个错误情况引起的。例子如下:
非本地跳转的另一个重要应用是使一个信号处理程序分支到一个特殊的代码位置,而不是返回到达中断了的指令位置。例子如下:
程序输出如下:
Linux系统提供了大量的监控和操作进程的有用工具:
- STRACE:打印一个正在运行的程序和它的子进程调用的每个系统调用的轨迹。对于好奇的的工具。用-StatiC编译你的程序,能传到一个更干净的、不带学生而言,这是一个令人着迷有大量与共享库相关的输出的轨迹。
- PS:列出当前系统中的进程(包括僵死进程)
- TOP:打印出关于当前进程资源使用的信息。
- PMAP:显示进程的存储器映射。proc:一个虚拟文件系统,以ASCII文本格式输出大量内核数数据结构的内容,用户程序可 cat 2 / proc / load avg” , 观察在Linux系统上的平均负载。
标签:
原文地址:http://www.cnblogs.com/20135336wwz/p/4986765.html