目录
一、进程终止
一个进程在退出的时候,有以下三种情况:
- 代码运行完毕,结果正确
- 代码运行完毕,结果不正确
- 代码异常终止
1.1 程序正常终止
我们可以通过在main函数中return、调用exit或_exit函数让一个进程正常终止,进程正常结束后会返回一个退出码。不同的退出码可以代表不同的错误原因,用于告诉用户程序是否发生错误、发生了什么错误。
例如return 0就是返回一个为0的退出码,表示程序成功运行
我们可以通过 echo $? 命令来查看上个进程的退出码,例如:
#include <stdio.h>
int main()
{
return 12;
}
这个程序将会返回退出码12,我们运行该程序后输入上面的命令
问题来了:我怎么知道有哪些退出码,什么退出码又对应哪些错误原因呢?
我们可以用strerror函数来观察,向该函数传入退出码后会返回该退出码对应的错误信息
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
for(int i = 0;i < 200;i++)
{
printf("%d: %s\n", i, strerror(i));
}
return 0;
}
1.2 程序异常终止
有时候运行代码时会遇到一些严重错误导致程序异常终止,此时我们就不用关心退出码了
就好比你考试考差了,原因是身体不舒服。但是如果你作弊,直接无法完成考试,别人也不会关心其他的原因了。所以如果程序异常终止或运行结果不正确,我们都要先检查是否出现异常,再检查退出码
程序发生异常后,对应的异常会被系统转化为信号的形式发送给父进程
在程序中将一个变量除以0,或者使用野指针都会导致异常。我们可以尝试一下:
可以看到除0错误在编译时就已经出现了警告,运行程序后直接发生Floating point exception即浮点数溢出的异常
而野指针错误在编译时虽然不会发出警告,但是运行程序后也会发生Segmentation fault即段错误的异常
实际上,每种异常也都有自己的编号,我们可以使用命令 kill -l 来查看
其中Floating point exception对应的编号为8,Segmentation fault对应的编号为11
我们甚至