进程终止
进程终止时,操作系统释放进程申请的相关内核数据结构和对应的数据和代码,本质就是释放系统资源。
进程终止的常见场景
- 代码跑完,结果正确
- 代码跑完,结果错误
- 代码没有跑完,程序崩溃了
main函数返回值的意义
main函数返回值叫做进程的退出码
查看最近一个进程的进程退出码
echo $?
main函数返回值返回给上一级进程,用来评判进程执行结果。
return 0,表示程序运行结果正确
return 非0,表示运行结果不正确
不同的非0值可以表示不同的错误原因,这样在我们的进程结束之后,结果不正确的时,方便定位错误的原因。
strerror函数
#include <string.h>
char *strerror(int errnum);
根据不同的进程退出码,返回错误的原因
我们可以使用这些退出码的含义,但是你也可以自己设计一套退出方案。
当程序崩溃的时候,退出码时无意义的。
进程终止的方法
main函数内的return语句,就是终止进程的。
普通函数内的return是终止函数调用的,main函数内的return语句可以直接终止进程
exit()函数
C语言的一个库函数
#include <stdlib.h>
void exit(int status);
代码演示:
#include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 int main()
5 {
6 printf("hello world\n");
7 printf("hello world\n");
8 printf("hello world\n");
9
10 exit(222);
11
12 printf("hello world\n");
13 printf("hello world\n");
14 printf("hello world\n");
15 printf("hello world\n");
16 printf("hello world\n");
23 return 0;
24 }
执行结果:
进程退出码就是exit函数的参数。
_exit()函数
这是一个系统接口函数
#include <unistd.h>
void _exit(int status);
这个函数执行效果和exit函数基本一样,但是在涉及到io操作时不一样。
看示例:
#include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5
6 int main()
7 {
8 printf("hello world");
9 sleep(3);
10 // exit(1);
11 _exit(1);
32 }
当printf函数不带\n时,缓冲区里面的内容不会被刷新出来,当执行exit函数时,sleep三秒后进程退出,缓冲区的内容刷新到屏幕上
但是当我执行_exit函数时,缓冲区的内容并没有被刷新到缓冲区上。
这就是这俩函数的差别:
这样我们可以窥见,printf函数中数据是保存在缓冲区中的,这个缓冲区一定不在操作系统内部,假如说在操作系统内部,那么_exit()函数也能把缓冲区刷新出来,其实这个缓冲区是由C标准库维护的