进程(5)——进程终止【linux】

本文详细解释了Linux进程中正常终止、出错终止和异常退出的区别,通过C语言示例探讨了return、exit和_exit的差异,并介绍了查看返回值和使用errno处理错误的方法。同时提及了进程信号在异常情况下的作用。
摘要由CSDN通过智能技术生成


主要内容:
1.进程终止的情况
2.查看进程终止的结果

一. 进程结束情况

这里进程终止可以分成三种情况

i. 正常终止

正常就是程序正确完整的执行完了程序内容。

ii. 出错终止

出错终止就是程序执行了程序内容,出现了错误,但是程序终止了

iii. 异常退出

异常退出是产生错误,导致程序崩溃,程序被迫终止

二. 进程返回值(针对正常和出错)

我们知道进程正终止和出错终止程序都是正常终止了
那如何对这两个进行区分?

其实区分的方式就是我们平常写代码时不经意中写的一行代码

#include<stdio.h>
int main()
{
  printf("hello world");
  return 0;
}

这里就拿入门时候看吐的hello world来举例子

这里能清楚的看到
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语言中的对应返回值的对应出错

这里表示程序正常运行很简单,返回值直接是0就行了

但是如果是出错终止,那就有很多种的错误
想要表示出分别是哪种错误,就要用不同的返回值来表示

但是要记住每一种返回值对应的错误很难
所以在C语言中也进行了对应返回值和对应错误整合
这里我们能进行查看

#include<string.h>
#include<stdio.h>
int main()
{
  for(int i=0;i<200;i++)
  {
  printf("%d :%s\n",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));
}

在这里插入图片描述
这里我们能直接看到他的结果

errno的值是12
正好对应了存储空间不足的这个错误。

2.4 查看系统进程的返回值

这里我们就要用到一个指令了:
echo $?查看上个程序的返回值

这里我们可以来进行实验一下
在这里插入图片描述

这里能看到输出结果是No such file or director

因为linux内核使用C语言来写的,所以按道理应该和C一样

这里我们能看到C语言中对应的No such file or director
在这里插入图片描述
对应的返回值是2

那我们ls本质也是个进程,所以我们可以用echo $?来进行查看

是否返回值是2

在这里插入图片描述
结果正如我们想象

因为linux中有默认接口,将对应的错误码转换成对应错误
所以它会直接输出对应返回值的错误字符串

三. 进程信号(针对异常)

进程异常退出
这个部分我们先不细讲,后面在信号的时候会着重讲
这里就小提一下

进程异常崩溃退出
这个时候就说明程序发生了异常错误,这个时候连程序都没完整走完
所以这个时候程序的返回值就已经不重要

所以如果进程异常退出了,这个时候就不关心它的返回码了
但是要关心它为什么异常

这里我们就要知道异常的本质了

当程序异常的时候会被系统转化为信号,交给计算机硬件设备,进行处理

但是具体的信号之类的过程以后会专门出博客来讲。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想学c啊啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值