父进程回收子进程:wait()??
不回收:变成僵尸进程,内存泄漏
SIGINT:终止前台程序,等价于ctr + c
SIGKILL:
SIGSEGV:段故障
SIGALARM
SIGCHLD:子进程停止或终止
负的PID会导致信号被发送到进程组PID中的每个进程
接收信号:由内核模式切换为用户模式时检查信号,还是在内核时检查
获取进程ID:
pid_t getpid(void)
获取父进程ID:
pid_t getppid(void)
进程状态:
运行
停止/挂起:SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU
终止:1. 收到一个信号,信号默认行为是终止? 2. 从主程序返回? 3. 调用exit
void exit(int status);
pid_t fork(void);
父进程中:返回子进程的PID
子进程中:返回 0
父进程和子进程并发执行
进程图特别有助于理解带嵌套 fork 调用的程序
当一个进程由于某种原因终止时,内核并不是立即把它从系统中清除。相反,进程被保持在一种已终止的状态中,直到被它的父进程回收(reaped)。当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程,从此时开始,该进程就不存在了。一个终止了但还未被回收的进程称为僵死进程(zombie)。
父进程终止,内核会安排 init 进程成为其孤儿进程的养父,并回收其僵死子进程。init 进程:PID为 1 ,不会终止,是所有进程的祖先。
父进程回收子进程:wait 或 waitpid
wait:等待子进程退出,没有就一直等待。也是一种同步的方式。信号:异步的方式。
一个进程可以通过调用 waitpid 函数来等待它的子进程终止 或者 停止:
waitpid:等待特定的子进程
pid_t waitpid(pid_t pid, int * statusp, int options);
execve:在当前进程上下文中加载并运行一个新程序
execve:加载并运行程序
信号:通知进程系统中发生了某种类型的事件。
信号提供了一种机制,通知用户进程发生了这些异常。(内核发送信号给用户进程)
待处理信号:发出而未被接收的信号。任何时刻,一种类型至多只会有一个待处理信号。
发送信号原因:
1. 内核检测到一个系统事件
2. 一个进程调用了 kill 函数,显式地要求内核发送一个信号给目的进程(可以是自己)
pid 大于0:kill 函数发送信号 sig 给进程 pid
pid 等于0:kill 函数发送信号 sig 给进程所在进程组中的每个进程,包括调用进程
pid 小于0:kill 函数发送信号 sig 给进程组 | pid | 中的每个进程
接收信号包括:忽略信号,终止,执行信号处理程序捕获信号
信号处理程序:
捕获信号:调用信号处理程序
处理信号:执行信号处理程序
C语言提供一种用户级异常控制流形式:非本地跳转,将控制直接从一个函数转移到另一个当前正在执行的函数,不需要经过调用-返回序列。
非本地跳转通过 setjmp 和 longjmp 函数提供
setjmp:存档
longjmp:读档
非本地跳转:在多层跳转中直接跳转到最外层的部分
考试只考一个点:
setjmp:被调用一次,返回多次
longjmp:被调用一次,从不返回
fork :调用一次,返回两次
exit :调用一次,从不返回
1. 允许从一个深层嵌套的函数调用中立即返回,通常是检测到某个错误情况引起的,如果在一个深层嵌套的函数调用中发现一个错误情况,我们可以使用非本地跳转直接返回到一个普通的本地化错误程序。
2. 另一个重要应用是使一个信号处理程序分支到一个特殊的代码位置,而不是返回到被信号到达中断了的指令的位置。
默认行为/信号处理函数:进程终止,进程挂起/停止,进程忽略该信号
信号处理程序:
1. 设置信号处理程序
2. 捕获信号
3. 处理信号
?
待处理信号:pending
?非本地跳转??????????54:00
2-6 OS,重点:3,5,第4章:难理解,考题有限制
7-10 OS,重点:9,7/8:难理解,考得少
9,6章联系图像 小部件