CSAPP:第八章 异常控制流2
CSAPP:第八章 异常控制流2
关键点:进程控制、信号
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)
signal通过以下三种方法之一来改变和信号signum的关联行为:
- 如果handler为SIG_IGN,那么忽略类型为signum的信号
- 如果handler是SIG_DFL,那么类型为signum的信号行为恢复为默认行为
- 否则,handler就是用户定义的函数地址,这个函数称为信号处理程序。调用信号处理程序被称为捕获信号。执行信号处理程序被称为处理信号。
CSAPP:第八章 异常控制流2的更多相关文章
- CSAPP:第八章 异常控制流1
CSAPP:第八章 异常控制流1 关键点:异常 8.1 异常8.2 进程 现代系统通过使控制流发生突变来对这些情况做出反应,一般而言,我们把这些突变称为异常控制流(Exceptional Cont ...
- csapp:第八章 异常控制流ECF
第八章 异常控制流ECF 8.1 异常 Exception graph LR E[异常Exception]-->E2[中断:异步异常] E-->E3[同步异常] E3-->陷阱 E3 ...
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- [CSAPP笔记][第八章异常控制流][呕心沥血千行笔记]
异常控制流 控制转移 控制流 系统必须能对系统状态的变化做出反应,这些系统状态不是被内部程序变量捕获,也不一定和程序的执行相关. 现代系统通过使控制流 发生突变对这些情况做出反应.我们称这种突变为异常 ...
- 深入理解计算机系统 第八章 异常控制流 part1
本章主旨 第八章的目的是阐述清楚应用程序是如何与操作系统交互的(之前章节的学习是阐述应用程序是如何与硬件交互的) 异常控制流 异常控制流,即 ECF(exceptional contril flow) ...
- CSAPP学习笔记(异常控制流1)
1:诸如子进程结束之后父进程需要被告知,有时候应用程序需要系统调用,内核通过上下文切换将控制从一个进程切换到另一个进程,还有一个进程发送信号到另一个进程时接收者转而到它的信号处理函数去执行等等,我们的 ...
- 深入理解计算机系统 第八章 异常控制流 Part1 第二遍
第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了第 500~507 页,共 8 页) 第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/101651 ...
- 深入理解计算机系统 第八章 异常控制流 Part2 第二遍
第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了第 508~530 页,共 23 页) 第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/10206 ...
- 深入理解计算机系统 第八章 异常控制流 part2
关于进程,需要关注其提供给应用程序的两个关键抽象: 1.一个独立的逻辑控制流,它提供一个假象,好像我们的程序独占地使用处理器 2.一个私有的地址空间,它提供一个假象,好像我们的程序独占地使用内存系统 ...
随机推荐
- 【EF6学习笔记】目录
[EF6学习笔记](一)Code First 方式生成数据库及初始化数据库实际操作 [EF6学习笔记](二)操练 CRUD 增删改查 [EF6学习笔记](三)排序.过滤查询及分页 [EF6学习笔记]( ...
- UML简单介绍-如何看懂UML(一)
在计算复杂的数学题时,我们必然会打草稿计算 在绘画课中,我们可以素描出来看到的事物 那么在程序设计中呢? 如何描绘传达你脑海中的关于这个程序 ,设计的蓝图草稿? OOP的程序设计中,最多的自然 ...
- VSTO中Word的Range复制方式
VSTO中Word的Range复制方式 前言 VSTO是一套用于创建自定义Office应用程序的Visual Studio工具包,通过Interop提供的增强Office对象,可以对Word文档进行编 ...
- [Go] 并发和并行的区别
并发和并行的区别:1.并行是让不同的代码片段同时在不同的物理机器上运行,并行的关键是在不同的物理机器上同时运行 2.并发是同时管理很多事情,比如在一个物理机器上进行不停的调度,有些事情可能只做了一半就 ...
- Android开发——获得Json数据,并显示图片
流程介绍 使用okhttp网络框架进行get请求,获得json数据 //一个封装好的工具类的静态方法 public static void sendOkHttpRequest(final String ...
- JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能
摘要: 理解浏览器渲染. 原文:JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是专门探索 J ...
- 一种递推组合数前缀和的Trick
记录一下一种推组合数前缀和的方法 Trick 设\(\sum_{i = 0}^m C_n^i = S(n, m)\) \(S\)是可以递推的 \(S(n, m + 1) = S(n, m) + C_{ ...
- #WEB安全基础 : HTML/CSS | 0x7HTML5和W3C验证
标准,标准,什么都有标准 你听说过HTML5吗?这是一个新版本,当然也有新标准 我只准备了一个index.html文件 以下是代码 <!DOCTYPE html> <!--告诉浏览器 ...
- Android连续点击多次事件的实现
有时候我们需要实现这样的场景,类似进入开发者模式,即多次点击后执行操作. 首先我们先看一个方法: System提供的一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制. publi ...
- onScrollChanged()
转载请标明出处:http://www.cnblogs.com/tangZH/p/8428100.html onScrollChanged里面有四个参数 @Overrideprotected void ...