笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述CSAPP:第八章 异常控制流2相关的知识,希望能为你提供帮助。
CSAPP:第八章 异常控制流2
关键点:进程控制、信号8.4 进程控制8.5 信号
8.4 进程控制
??Unix提供了大量从C程序中操作进程的系统调用。
8.4.1 获取进程ID
??每个进程都有一个唯一的正数(非零)进程ID(PID)。getpid函数返回调用进程的PID,getppid函数返回它父进程的PID
1#include
<
sys/types.h>
2#include
<
unistd.h>
3pid_t
getpid(void);
4pid_t
getppid(void);
5#pid_t
在Linux系统的types.h中定义为int
8.4.2 创建和终止进程
??从程序员角度,我们可以认为进程总是处于下面三种状态之一:
- 运行。进程要么在CPU上执行,要么在等待被执行且最终会被CPU内核调度。
- 停止。进程的执行被挂起,且不会被调度。当收到SIGSTOP、SIGTSTP、SIGTTIN或者SIGTTOU信号时,进程就停止,并且保持停止直到它收到一个SIGCONT信号,在这个时候,进程再次运行。
- 终止。进程永远地停止了。进程会因为3种原因终止:1)收到一个信号,该信号的默认行为是终止进程;2)从主程序返回;3)调用exit函数。
1#include
<
stdlib.h>
2void
exit(int
status);
3exit函数以status退出状态来终止进程
??父进程通过调用fork函数创建一个新的运行子进程。
1#include
<
sys/types.h>
2#include
<
unistd.h>
3pid_t
fork(void);
??子进程得到与父进程用户级虚拟地址空间相同的(但是独立的)一份副本,包括代码和数据段、堆、共享库以及用户栈。子进程还获得与父进程任何打开文件描述符相同的副本。父进程与子进程最大的区别是它们有不同的PID。
??fork函数被调用一次,却会返回两次:一次调用进程(父进程)中,一次是在新创建的子进程中。在父进程中fork返回子进程的PID。在子进程中fork返回0
8.4.3 回收子进程
??当一个进程由于某种原因终止时,内核并不是立即把它从系统中清除。相反,进程被保持在一种已终止的状态中,直到被它的父进程回放(reaped)。当父进程回收已经终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程,从此时开始,该进程就不存在了。一个终止了但还没被回收的进程称为僵死进程。
??如果一个父进程终止了,内核会安排init进程成为它的孤儿进程的养父。init进程的PID为1,是在系统启动内核创建的,它不会终止,是所有进程的祖先。如果父进程没有回收它的僵尸子进程就终止了,那么内核会安排init进程取回收它们。
??一个进程可以通过调用waitpid函数来等待它的子进程终止或者停止。
1#include
<
sys/types.h>
2#include
<
sys/wait.h>
3pid_t
waitpid(pid_t
pid,
int
*statusp,int
options);
4//返回:如果成功,则为子进程的PID,如果WNOHANG,则为0;如果其他错误则为-1.
8.4.4 让进程休眠
??sleep函数将一个进程挂起一段时间
1#include
<
unistd.h>
2unaigned
int
sleep(unsigned
int
sec);
3//如果请求到了返回0,否则返回还剩下休眠时间的秒数
8.4.5 加载并运行程序
??execve函数在当前进程的上下文中加载并运行一个新程序。
1int
execve(const
char*filename,const
char
*argv[],const
char*envp[]);
2execve执行可执行目标文件filename,且带参数列表argv和环境变量列表envp
8.5 信号
??一个信号就是一条小道消息,它通知进程系统中发生了某种事件
文章图片
8.5.1 信号术语
- 发送信号
- 接收信号
8.5.2 发送信号
??Unix系统提供了大量向进程发生信号的机制。所有机制都是基于进程组的概念。每个进程都只属于一个进程组,进程组是由一个正整数ID来标识。 - 用bin/kill程序发生信号
- 从键盘发生信号
- 用kill函数发生信号
- 用alarm发送信号
8.5.3 接收信号
??每个信号类型都有一个预定的默认行为,是下面的一种: - 进程终止
- 进程终止并转储内存
- 进程停止(挂起)直到被SIGCONT信号重启。
- 进程忽略该信号
1#include<
signal.h>
2typedef
void
(*sighandler_t)(int);
3sighandler_t
signal(int
signum,sighandler_t
handler)
【CSAPP(第八章 异常控制流2)】??signal通过以下三种方法之一来改变和信号signum的关联行为:
- 如果handler为SIG_IGN,那么忽略类型为signum的信号
- 如果handler是SIG_DFL,那么类型为signum的信号行为恢复为默认行为
- 否则,handler就是用户定义的函数地址,这个函数称为信号处理程序。调用信号处理程序被称为捕获信号。执行信号处理程序被称为处理信号。
推荐阅读
- [PWA] Add Push Notifications to a PWA with React in Chrome and on Android
- Xamarin.Android 开发中遇到旋转屏幕错误
- VUE项目用hbuilder 打包为手机APP
- vue+hbuilder监听安卓返回键问题
- 记一次 Android 客户端的逆向
- Android使用Xutil3.0下载文件.md
- 配置cordova的android开发环境(无android studio)
- Android的断点续传的下载在线文件示例
- 微信自动跳转浏览器打开APP(APK)下载链接