2018-2019-1 20165330 《信息安全系统设计基础》第七周学习总结
学习目标
- 了解异常及其种类
- 理解进程和并发的概念
- 掌握进程创建和控制的系统调用及函数使用:
fork
,exec
,wait
,waitpid
,exit
,getpid
,getppid
,sleep
,pause
,setenv
,unsetenv
- 理解数组指针、指针数组、函数指针、指针函数的区别
- 理解信号机制:
kill
,alarm
,signal
,sigaction
- 掌握管道和I/O重定向:
pipe
,dup
,dup2
学习内容
异常
-
是控制流中的突变,一部分由硬件实现,一部分由操作系统实现,用来响应处理器状态中的某些变化。
-
异常处理
- 异常表:在系统启动时(当计算机重启或者加电时),操作系统分配和初始化一张称为异常表的跳转表
- 异常表基址寄存器:存放异常表的起始地址
- 非本地跳转
#include <setjmp.h> int setjmp(jmp_buf env); int sigsetjmp(sigjmp_buf env,int savesigs);
- 异常表:在系统启动时(当计算机重启或者加电时),操作系统分配和初始化一张称为异常表的跳转表
-
类别
类别 | 原因 | 异步/同步 | 返回行为 |
---|---|---|---|
中断 | 来自I/O设备的信号 | 异步 | 总是返回到下一条指令 |
陷阱 | 有意的异常 | 同步 | 总是返回到下一条指令 |
故障 | 潜在可恢复的错误 | 同步 | 可能返回到当前指令 |
终止 | 不可恢复的错误 | 同步 | 不会返回 |
进程
- 系统中的每个程序都运行在某个进程的上下文中。
- 上下文:是由程序正确运行所需的状态组成的,包括内存中的代码和数据、它的栈、通用寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。
- 关键抽象
- 逻辑控制流:提供一个假象,好像我们的程序独占地使用处理器
- 私有的地址空间:提供一个假象,好像我们的程序独占地使用内存系统
- 逻辑控制流:提供一个假象,好像我们的程序独占地使用处理器
- 并发流
- 一个逻辑流的执行在时间上与另一个流重叠
- 并发:多个流并发的执行的一般现象
- 多任务(时间片):一个进程和其他进程轮流运行
- 上下文切换控制多任务
- 发生时机:
- 内核调度新的进程时
- 内核代表用户执行系统调用时
- 中断也可引发上下文切换
- 发生时机:
进程控制
- 获取进程ID
#include <sys/types.h> #include <unistd.h> pid_t getpid(void); pid_t getppid(void);
- 进程状态
- 运行
- 停止:进程的执行被挂起,且不会被调度。
- 终止
- 收到一个信号,该信号的默认行为是终止进程
- 从主程序返回
- 调用
exit
函数#include <stdlib.h> void exit(int status);
- 回收子进程
- 当一个进程由于某种原因终止时,进程被保持在一种已终止的状态中,直到被它的父进程回收。
- 一个进程调用
waitpid
函数等待它的子进程终止或停止
#include <sys/types.h> #include <wait.h> pid_t waitpid(pid_t pid,int *statusp,int options);
- 加载并运行程序
execve
函数在当前进程的上下文中加载并运行一个新程序
#include <unistd.h> int execve(const char *filename,const char *argv[],const char *envp[]);
信号
- 一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件
- Linux信号
- 发送信号
- 用/bin/kill程序发送:
/bin/kill -9 -15213
- 从键盘发送:
ls / sort
- 用
kill
函数发送#include <sys/types.h> #include <signal.h> int kill(pid_t pid,int sig);
- 用
alarm
函数发送#include <unistd.h> unsigned int alarm(unsigned int secs);
- 用/bin/kill程序发送:
- 接收信号
- 当目的进程被内核强迫以某种方式对信号的发送做出反应时,它就接收了信号。
- 进程可以忽略这个信号,终止或者执行下一个称为信号处理程序的用户层函数捕获这个信号。
- 待处理信号
- 一个发出而没有被接收的信号
- 在任何时刻,一种类型至多只有一个待处理信号