标签:
异常是异常控制流的一种形式,由硬件和操作系统实现。简单来说,就是控制流中的突变。
异常的处理方式:
异常号是到异常表中的索引,异常表的起始地址放在异常表基址寄存器。
每一个系统调用都有一个唯一的整数号,对应于一个到内核中跳转表的偏移量。
系统中的每个程序都是运行在某个进程的上下文中的。
上下文:由程序正确运行所需的状态组成的。
进程提供给应用程序的关键抽象:
进程从用户模式变为内核模式的唯一方法是通过异常——中断,故障,或者陷入系统调用。
1.保存当前进程的上下文
2.恢复某个先前被抢占的进程被保存的上下文
3.将控制传递给这个新恢复的进程。
终止:永远停止。原因:
1.收到信号,默认行为为终止进程
2.从主程序返回
3.调用exit函数
父进程通过调用fork函数来创建一个新的运行子进程。
fork函数只被调用一次,但是会返回两次:父进程返回子进程的PID,子进程返回0.如果失败返回-1.
调用fork函数n次,产生2的n次方个进程。
exit函数以status退出状态来终止进程。
进程终止后还要被父进程回收,否则处于僵死状态。
如果父进程没有来得及回收,内核会安排init进程来回收他们。init进程的PID为1.
一个进程可以通过调用waitpid函数来等待它的子进程终止或停止。
成功返回子进程PID,如果WNOHANG,返回0,其他错误返回-1.
成功返回子进程pid,出错返回-1
sleep函数使一个进程挂起一段指定的时间。
返回值是剩下还要休眠的秒数,如果到了返回0.
让调用函数休眠,直到该进程收到一个信号。
#include <unistd.h>
int execve(const char *filename, const char *argv[], const char *envp[]);
成功不返回,失败返回-1.
execve函数调用一次,从不返回。
在环境数组中搜寻字符串"name=value",如果找到了就返回一个指向value的指针,否则返回null。
如果环境数组包含"name=oldvalue"的字符串,unsetenv会删除它,setenv会用newvalue代替oldvalue,只有在overwrite非零时成立。
如果name不存在,setenv会将"name=newvalue"写进数组。
※fork函数和execve函数的区别
fork函数是创建新的子进程,是父进程的复制体,在新的子进程中运行相同的程序,父进程和子进程有相同的文件表,但是不同的PID
execve函数在当前进程的上下文中加载并运行一个新的程序,会覆盖当前进程的地址空间,但是没有创建一个新进程,有相同的PID,继承文件描述符。
传递一个信号到目的进程的两个步骤:发送信号和接收信号。
1.内核检测到一个系统事件
2.一个进程调用了kill函数,显式的要求内核发送一个信号给目的进程。
1.忽略 2.终止 3.执行信号处理程序,捕获信号
/bin/kill程序可以向另外的进程发送任意的信号,格式是:
/bin/kill -n m
n是信号,m是进程或进程组
当n>0时,发送信号n到进程m
当n<0时,使信号|n|发送到进程组m中的所有进程。
进程通过调用kill函数发送信号给其他进程。
信号是一种进程间通信的方法,应用于异步事件的处理,实质是软中断。
信号产生、信号注册、信号注销、信号处理
stty-a,查看哪些按键可以产生信号
捕捉:signal函数
忽略信号:SIG_IGN
默认操作:SIG_DFL
调用环境:程序计数器,栈指针,通用目的寄存器
longjmp函数从env缓冲区中恢复调用环境,然后触发一个从最近一次初始化env的setjmp调用的返回。然后setjmp返回,并带有非零的返回值retval。
setjmp函数只被调用一次,但返回多次;
longjmp函数被调用一次,但从不返回。
用时:6小时
感想:学习的时候,先根据老师提供的重点学习,进程的切换等相关知识与操作系统的知识相关联,这方面比较易于接受,别的书上的知识点难以理解,看视频,视频太长,看得略浮躁。搁下一段时间再看,学得有点累。但是还是有收获的,学会能够知道数组指针、指针数组、函数指针、指针函数的区别了。
标签:
原文地址:http://www.cnblogs.com/EliteDci/p/4986685.html