在进程控制的章节我们讲解了我们的进程创建,这章节对进程控制进行补充,
进程终止
在我们创建一个进程之后我们避免不了我们去终止我们的进程。
终止场景
- 正常退出,结果符合我们的预期
- 正常退出,结果不符合我们的预期
- 异常退出
终止方式
- main函数直接return
- 调用exit函数
- 调用_exit函数
#include <unistd.h>
void _exit(int status);
#include <stdlib.h>
void _Exit(int status);
虽然两个函数都是可以让进程终止的,但是两个函数并不是完全一样的
exit和_exit的区别
- exit是一个库函数,而_exit是一个系统调用接口函数
- exit退出之前会刷新缓冲区,做退出的收尾工作,_exit直接退出,并不会刷新缓冲区
函数返回值
两个函数的返回值都是传入参数,用来保存我们的退出原因。
错误码
是一个全局变量,每个系统调用执行完毕之后都会重置errno这个变量,这个全局变量存储的就是当次调用的系统接口调用接口错误编号,当调用出错的时候可以使用perror和strerror函数对出错信息进行打印
进程等待
进程等待其实就是父进程等待子进程退出,避免僵尸进程,在默认的情况下是一个阻塞函数。
阻塞的概念:为了完成一项工作,如果当前条件不具备完成条件,则一直等待,知道最后完成
非阻塞的概念:为了完成一向工作,如果当前不具备完成条件,则立即报错返回
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
wait函数是等待任意一个子进程退出则退出
wait_pid默认是可以等待任意一个子进程退出则退出,当时我们可以设置我们的参数,可以回收指定的参数
waitpid
pid:当pid=-1的时候等待任意一个子进程,与wait函数类似,当pid>0的时候我们等待其进程id和pid相等的子进程退出则退出。
options:选择参数
- WNOHANG :设置waitpid设置为非阻塞函数
- WUNTRACED
- WCONTINUED
status:传入参数,是保存我们退出信息的
status是一个int型4字节。但是我们的状态只使用了低16为,高八位存储子进程退出返回值,低七位保存了异常退出信号值,第八位是core dump标志(程序异常退出时是否保存运行信息)。
- 获得子进程推出码:(status>>8)&&0xff
- 判断程序是否正常退出,信号值为0就是正常退出,否则不是正常退出,status&&0x7f,就可以得到我们的信号值。