一、进程退出的三种场景
- 代码运行完毕,结果正确
- 代码运行完毕,结果错
- 代码异常终止(不需要再看退出码)
二、进程常见退出方法(利用echo $?可以查看最近一个进程的退出码)
正常退出:
- 从main函数返回
- 调用exit
- _exit
注意:
return :在main函数中调进程退出
exit/_exit:在任何地方调进程都会退出
异常退出:
- ctrl + c,信号终止
三、exit 和 _exit的不同
首先看一个例子:
调用_exit函数退出
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hi lw");
exit(-1);
}
执行结果:
从执行结果可以看出,执行程序之后,并没有输出结果,而且进程退出码是255,为什么???
调用exit函数退出
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hi lw");
exit(-1);
}
调用exit函数之后,打印出了结果,但是退出码还是255???
首先得明确一点,进程的退出码是int类型的,但是exit函数中供我们使用的错误码只有8个比特位(第8位到第16位),所以我们看到的退出码是255,而其他位被标记了别的信息,例如程序是否正常退出,如果是异常退出,退出码会指明它是什么原因退出的。
现在再谈一谈,为什么调exit和_exit,输出结果不一样???
首先看一下调这两个函数时程序的执行顺序:
调用_exit函数,程序退出非常粗暴,不刷新缓冲区,直接进入内核,所以我们在显示器上看不到结果,但是调用exit函数,会清理、关闭流、刷新,最后再进入内核,所以刷新出来的数据打印在显示器上我们就会看到了。
最后需要注意的是,虽然exit和_exit都终止了进程,但是但是进程退出之后,并不会立即释放全部资源,需要维护自身状态,判断进程退出结果。
四、return退出
通常我们在函数中执行的return n等同于执行exit(n),因为调用main运行时函数会将main的返回值当作exit的参数。