一. 进程结束情况
i. 正常终止
ii. 出错终止
iii. 异常退出
异常退出是产生错误,导致程序崩溃,程序被迫终止
二. 进程返回值(针对正常和出错)
我们知道进程正终止和出错终止程序都是正常终止了
那如何对这两个进行区分?
#include<stdio.h>
int main()
{
printf("hello world");
return 0;
}
这里能清楚的看到
return表示了程序结束结果
这就是用来区分终止结果的代码了。
2.1. 进程的退出方式
i. return
这个算是我们最常用的终止方式了
#include<stdlib.h>
#include<stdio.h>
int test()
{
int arr[10];
int* i=(int*)malloc(sizeof(arr[10]));
if(i==NULL)
{
return -1;
}
else
{
return 0;
}
}
int main()
{
if(test()==-1)
{
printf("error");
}
else
{
printf("success");
}
}
这里随便写个代码
这里我们就能看到return的特殊性了。
ii. exit
正如上面我们说return特殊性
return带来返回值后程序还能继续执行
但是exit就不一样了,它执行后,不管在哪个函数,会直接终止进程
#include<stdlib.h>
#include<stdio.h>
void test()
{
exit(0);
}
int main()
{
test();
printf("123");
}
这里我们能发现运行结果没有打印123
如果我们把exit换成return
肯定是能打出来123的
这就体现了return和exit的区别
iii. _exit
_exit和exit同样也有区别
别看就差了一个横杠,但是差距同样很大
_exit是系统中的一个调用接口
但是exit是C语言中自带的一个方法。
这里我们用一个代码就能展现出它们的差别了。
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
printf("123");
exit(0);
}
这里我们能看到结果是123
那如果我们换成_exit呢?
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
printf("123");
_exit(0);
}
这里我们就能发现它并没有打印出123
这里就能体现出exit和_exit的区别了
这里要科普一个小知识,printf数据时,并不会直接将数据打印在屏幕上
而是会先将数据,放在缓存区中
所以这里我们也能看出它们的区别了:
exit会按照步骤一步一步正常的退出进程(清空缓存区等)
_exit则会直接进行退出
2.2. 查看C语言中的对应返回值的对应出错
但是如果是出错终止,那就有很多种的错误
想要表示出分别是哪种错误,就要用不同的返回值来表示
但是要记住每一种返回值对应的错误很难
所以在C语言中也进行了对应返回值和对应错误整合
这里我们能进行查看
#include<string.h>
#include<stdio.h>
int main()
{
for(int i=0;i<200;i++)
{
printf("%d :%sn",i,strerror(i));
}
return 0;
}
多的就不放出来了
2.3 使用errno
C语言中有errno.h,其中有一个全局变量errno
是专门用来存储上一次出错对应值的变量
这里我们直接来使用一下
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int* i=(int*)malloc(1000*1000*1000*4);
printf("error=%d %s",errno,strerror(errno));
}
这里我们能直接看到他的结果
2.4 查看系统进程的返回值
这里我们就要用到一个指令了:
echo $?查看上个程序的返回值
这里能看到输出结果是No such file or director
这里我们能看到C语言中对应的No such file or director
对应的返回值是2
那我们ls本质也是个进程,所以我们可以用echo $?来进行查看
是否返回值是2
结果正如我们想象
因为linux中有默认接口,将对应的错误码转换成对应错误
所以它会直接输出对应返回值的错误字符串
三. 进程信号(针对异常)
进程异常退出
这个部分我们先不细讲,后面在信号的时候会着重讲
这里就小提一下
进程异常崩溃退出
这个时候就说明程序发生了异常错误,这个时候连程序都没完整走完
所以这个时候程序的返回值就已经不重要
了
所以如果进程异常退出了,这个时候就不关心它的返回码了
但是要关心它为什么异常
这里我们就要知道异常的本质了
当程序异常的时候会被系统转化为信号,交给计算机硬件设备,进行处理
原文地址:https://blog.csdn.net/Ruaaa_iiiiiiiii/article/details/134676733
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_12221.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!