1.进程的终止方式
根据《Unix高级系统环境》中的介绍,进程有5种正常终止方式:
1、main函数种执行return语句。
2、调用exit函数,他只终止运行程序和IO,不终止子进程。
3、进程中的最后的一个线程执行return语句
4、调用_exit或者_Exit函数。
5、进程的最后一个线程调用pthread_exit函数。
3种异常终止方式:
1、调用了abort,产生SIGABRT信号
2、当进程收到某些异常信号的时候,如:内存越界、有除以0的情况出现。
3、最后一个线程对取消请求做出了响应
- 父进程终止后,未终止的子进程会被init进程收养,init进程会获取子进程的状态,然后终止子进程,子进程不会再init进程中出现僵死状态。
- 如果子进程在父进程之前终止,父进程可以调用wait和waitpid获取子进程的状态。如果子进程没有被妥善的处理就会成为僵死进程。
2.wait和waitpid的区别
子进程的终止是一个异步的事件,父进程可以选择忽略或者响应,调用wait和waitpid会发生:
- 如果子进程还在执行,那就阻塞。
- 如果一个子进程已经终止,则取得子进程的终止状态后就立即返回。
- 如果没有任何的子进程则立即返回出错
两个函数的区别如下:
- 在一个子进程的终止前 ,wait会使得调用者阻塞,waitpid可以选择不阻塞。
- waitpid并不等待在其调用之后的第一个终止子进程
相同点:
- 当进程终止,终止进程的终止状态字节就存放在staloc整型指针中,终止状态存放在<sys/wait.h>头文件中,他们的名字都以WIF开头。
1、WIFEXITED(status):正常终止子进程返回的状态。
2、WIFSIGNALED(status):异常终止子进程的返回状态。
3、WIFSTOPPED(status):当前暂停子进程的返回状态。
4、WIFCONTINUED(status):作业控制暂停后已经继续的子进程返回状态。
waitpid提供的特有功能:
1、waitpid可以等待特有的进程,wait只能返回任意一个终止状态的子进程。
2、waitpid提供了一个wait的非阻塞版本。
3、waitpid通过WUNTRACED和WCONTINUED选项支持作业控制。
其他结束状态获取函数
- Unix系统还包括另外一个取得进程终止状态的函数-waitid,与waitpid类似但是使用更加的灵活,他使用两个独立的参数表示要等的子进程所属类型,而不是将此与进程ID、进程组ID组合成一个参数。
- wait3和wait4,是UNIX系统遗留下来的两个函数,允许内核返回又终止进程以及所有的子进程的资源该概况。
Plus
进程中为了避免在状态的轮询中,浪费CPU的时间,通常在多进程之间使用信号机制(相当于中断),来进行进程间的通信。