进程退出场景
- 代码运行结束,结果正确
- 代码运行结束,结果不正确
- 代码异常终止
进程常见的退出方法
1、正常退出(可通过指令 : echo $? 查看进程退出码($?是bash中的特殊变量,表示上个命令对应的进程退出码))
- 从main函数返回(main函数为程序入口函数,其返回值为进程退出码,0表示结果正确,非0表示结果不正确)
- 调用exit(例如:exit(1) 任何函数中可用;本质上也是调用_exit,只是对其进行了包装)
- _exit
2、异常退出
- 指令 : ctrc + c 信号终止
下面分别介绍一下这几个退出方法
1、_exit
1、函数原型
#include <unistd.h>
void _exit(int status);
2、⚠️
- 参数 status 定义了进程的终止状态,父进程通过 wait 来取该值。
- 虽然 status 是 int ,但是仅仅有低8位可以被父进程所用。所以 _exit(-1) 时,在终端通过 echo $? 查看退出码时,发现返回值为255。
2、exit
1、函数原型
-
#include <unistd.h> void exit(int status);
(可以发现,两个函数用法相同)
2、实现原理(exit最终也是调用_exit,但是在调用之前还做了其他工作,如下:)
- 执行用户通过 atexit 或者 on_exit 定义的清理函数
- 关闭所有打开的流,所有的缓存数据均被写入
- 调用 _exit
3、通过图来比较两者
左边_exit直接到内核,右边exit 做一系列事之后才能到达内核。
3、return
return是一种最常见的进程退出方法。
执行 return n ;相当于执行 exit (n) ,因为调用 main 的运行时函数会将 main 的返回值当作 exit 函数的参数。
补充:(刷新缓冲的方法)
1、首先得知道,缓冲区也是一段内存。
2、冲刷缓冲方法
- fflush(stdout)
- exit(0)
- '\n'
- main()函数退出 return 0