深刻理解计算机系统 第八章 异常控制流(2)

进程老是处于下面三种状态之一:函数

运行。进程要么在CPU上执行,要么在等待被执行且最终会被内核调度。
中止。进程的执行被挂起(suspended),且不会被调度。
终止。进程永远的中止了。进程会由于三种缘由终止:1)收到一个信号,该信号的默认行为是终止进程,2)从主程序返回,3)调用exit函数。
父进程经过调用fork函数建立一个新的运行的子进程。
fork函数的特色:
调用一次,返回两次。fork函数被父进程调用一次,可是却返回两次-----一次是返回到父进程,一次是返回到新建立的子进程。
当一个进程因为某种缘由终止时,内核并非当即把它从系统中清除。相反,进程被保持在一种已终止的状态中,直到被它的父进程回收(reaped)。当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,而后抛弃已终止的进程,今后时开始,该进程就不存在了。一个终止了但还未被回收的进程称为僵死进程(zombie)。
一个进程能够经过调用waitpid函数来等待它的子进程终止或者中止。
waitpid函数默认状况下(当options=0时),挂起调用进程的执行,直到它的等待集合(wait set)中的一个子进程终止。若是等待集合中的一个进程在刚调用的时刻就已经终止了,那么waitpid就当即返回。在这两种状况下,waitpid返回致使waitpid返回的已终止子进程的PID。此时,已终止的子进程已经被回收,内核会从系统中删除掉它的全部痕迹。
传送一个信号到目的进程是由两个不一样步骤组成的:
发送信号。内核经过更新目的进程上下文中的某个状态,发送(递送)一个信号给目的进程。发送信号能够有以下两种缘由:1)内核检测到一个系统事件,好比除零错误或者子进程终止。2)一个进程调用了kill函数,显式的要求内核发送一个信号给目的进程。一个进程能够发送信号给它本身。
接收信号。当目的进程被内核强迫以某种方式对信号的发送作出反应时,它就接收了信号。进程能够忽略这个信号,终止或者经过执行一个称为信号处理程序(signal handler)的用户层函数捕获这个信号。
相关文章
相关标签/搜索