【Linux进程管理】进程退出的几种方法
进程退出
当一个进程退出后,操作系统会释放掉这个进程的资源。包括这个进程分配的内存,打开的文件等等。所以进程退出后,不会出现内存泄漏的情况,进程一旦退出,所占的整个虚拟内存都被销毁,所有内存资源都会被系统回收
函数 | 描述 |
---|---|
exit | 执行完整的C库终止过程,终止进程,并向主机环境提供状态代码 |
_Exit | 执行最少的C库终止过程,终止进程,并向主机环境提供状态代码 |
_exit | 执行最少的C库终止过程,终止进程,并向主机环境提供状态代码 |
quick_exit | 执行快速的C库终止过程,终止进程,并向主机环境提供状态代码 |
_cexit | 执行完整的C库终止过程并返回给调用方。不终止进程 |
abort | 只终止进程,不释放进程所占用资源,并抛出abort异常log |
exit函数
函数原型
#include <stdlib.h>
void exit(int status);
函数作用
在调用后让进程正常退出;并且在进程退出时会刷新缓冲区数据
函数形参
status:进程退出时的状态值,即在使用时给它一个无符号的整数型,该数将作为进程的退出状态,0表示成功,其他值都表示失败;并且要在0-255范围内,否则将自动默认为未定义退出状态值。
linux提供$?特殊变量来保存最后一条命令执行结束的退出状态。执行完一条命令后,立即执行$?来获取最后一条命令的退出状态值
[Ubtuntu ~]$ echo $?
8
_exit()
函数原型
#include <unistd.h>
void _exit(int status);
函数作用
使用此函数将立即终止一个进程,并把它的状态值返回。由于进程是非正常结束;所以当进程死亡时,会通知父进程发出一个信号, SIGCHLD信号将告知系统回收该进程的资源;并且退出时不刷新缓冲区,若有打开的文件也不会进行关闭操作;所以可能会造成数据丢失。
函数形参
status:进程退出时的状态值,即在使用时给它一个无符号的整数型,该数将作为进程的退出状态;并且要在0-255范围内,否则将自动默认为未定义退出状态值。
atexit()
函数原型
#include <stdlib.h>
int atexit(void (*function)(void));
函数作用
注册一个进程退出处理函数,在进程正常退出(at normal exit)后再执行一个自己写的程序(与_exit一起使用无效),并且子进程会继承父进程注册的进程退出处理函数
函数形参
void (*function)(void):本质是一个函数指针,用于接受一个函数名,在执行结束后执行该函数的代码
abort()
函数原型
#include <stdlib.h>
void abort(void);
函数作用
立即终止当前进程,产生异常程序终止,系统会在结束进程后报一句Abort的log,但是abort()函数不会去清理进程环境,也就不会清理内存
(后附系统源码解析)