进程的状态
进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即运行态,就绪态,阻塞态。
一个进程从创建而产生至撤销而消亡的整个生命期间,有时占有处理器执行,有时虽可运行但分不到处理器、有时虽有空闲处理器但因等待某个事件的发生而无法执行,这一切都说明进程和程序不相同,它是活动的且有状态变化的,这可以用一组状态加以刻画。为了便于管理进程,一般来说,按进程在执行过程中的不同情况至少要定义三种不同的进程状态。
- 运行态(Running):进程占用CPU,在运行。
- 准备态(Ready):进程具备了运行条件等待系统分配CPU资源云心 。
- 阻塞态(Blocked):有时候也叫做等待态,指进程不具备运行条件,等待某事件的发生才能运行。
- 进行I/O访问,调用sleep,访问锁等,都可能进入阻塞态。
- 收到SIGSTOP,SIGSTP,SIGTTIN,SIGOUT信号时,进程会被停止。
- 所有的条件已经具备,收到SIGCONT,进程会进入运行态。
- 终止(Terminated):在五状态模型中,还会有新建态和终止态。新建态没有什么特别的,就是进程刚被创建。
进入终止态的三个原因:- 收到一个信号,该信号的默认行为是终止进程
- 从主程序返回(如从main函数返回一个整形)
- 调用exit函数
进程资源回收
前一篇父进程和子进程的关系已经说明了他们之间的关系,子进程结束后,要由父进程负责回收子进程的资源。
父进程应该如何回收那?父进程一般通过下面两个函数等待子进程结束和接受子进程的状态。
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
pid_t wait(int * status);
wait(&status) 是waitpid()的简化版本,相当于waitpid(-1,&status, 0);
这里只说明一下waitpid的一些参数和返回值。
参数pid:
- pid >0 表示等待进程id为pid的子进程结束。
- pid = 0, 表示等待与当前进程在同一个进程组的任意子进程结束。
- pid = -1, 表示等待任意子进程结束。
- pid < -1, 表示等待进程组id为-pid的任意子进程结束。
参数status
status为一个执行整形参数的指针,用来存储子进程的退出状态。如果子进程正常退出,status会被设置为子进程的退出状态。如果子进程被信号中断,status会被设置一个特殊的值,表示子进程被哪个信号中断。
options参数
是一个控制waitpid()函数行为的标志位,它可以取以下值:
WNOHANG:如果没有子进程结束,则立即返回0,不阻塞。
WUNTRACED:如果子进程进入暂停状态,也立即返回。
WCONTINUED:如果子进程恢复执行,则立即返回。
WSTOPPED:等待任何一个子进程进入暂停状态。
WEXITED:等待任何一个子进程结束。
WNOWAIT:不删除已经结束子进程的进程表项,用于后续处理。