• Linux进程终止


    在这里插入图片描述

    进程退出场景

    • 代码运行完毕,结果正确
    • 代码运行完毕,结果不正确
    • 代码异常

    进程退出码

    我们写的C/C++的代码,main函数每次都需要返回0,而这个return 0,就代表这进程的退出码,表征进程运行结果是否正确,通常0表示正确。

    int main()
    {
        printf("一个进程\n");
        return 0;	//0->success
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这个退出码会被父进程(bash)接收,我们可以使用指令==echo $?==拿到上一个进程的退出码,在命令行中,所以指令的父进程都是bash

    就好比,谁会关心一个孩子的成长呢?那肯定是他们的父母

    而对应正确的退出码,只有一个,那就是0,因为成功了,并不会详细询问;而运行结果不正确,则需要返回对应的退出码,告诉父进程,是什么原因失败了。

    例如我们考了班上的第一名,家长会说,儿子(小甜心)真棒!走,带你去吃好吃的;

    而我们如果考了倒数,家长则会问为什么只考了这么点分?是什么原因?

    image-20231026114604363

    所以这个main函数的返回值,本质上表示进程运行完成时是否运行正确;如果不正确,就用不同的数字表示不同的错误原因。

    strerror

    不过这些数字的退出码,是给计算机看的,我们并不懂,所以需要将这些退出码转换成对应的错误信息,所以在Linux中有一个接口strerror,将退出码转换成字符串。

    image-20231026115316835

    #include
    #include
    #include
    #include                                                                                                                                                                 
    int main()
    {
      for(int i =0;i<150;i++)
      {
        printf("%d: %s\n",i,strerror(i));
      }
      return 0; //进程的退出码,表征进程的运行结果是否正确  0-> success
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    通过strerror接口,我们就能查看到各个退出码所对应的信息。例如我们main函数返回的0

    image-20231026133935136

    其实本质上,父进程接收退出码,是为了给用户返回错误信息,已便用户做出相应的措施

    errno

    C语言也提供了一个接口errno,这里能返回最新一个错误码

    image-20231026141051689

    #include
    #include
    #include
    #include
    #include
    int main()
    {
      char* ch = (char*)malloc(1024*1024*1024*10);
      int ret = 0;
      if(ch == NULL)                                                                      
      {
        printf("malloc error ,%d -> %s\n",errno,strerror(errno));
        ret = errno;
      }
      else
      {
        printf("malloc success\n");
      }
      return ret;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    浅谈进程异常

    当进程退出异常的时候,这时候的退出码意义并不是很大。

    比如说,在一场考试过程中,有人作弊被抓到,这时候,他就属于考试异常,那么他的这个成绩也就无关紧要了。

    这时候对于老师或者家长,就要知道,这个异常的原因,而不是考试的成绩

    我们对指针的解引用操作,或者进行除0操作,都会导致程序异常,这些都有对应的信号,系统转给我们的进程,让其退出

    int main()
    {
        int* p;
        *p = 10;	//对野指针解引用
        int a = 1;
        a/=0;	//除0错误
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20231026163534011

    我们可以通过验证来发现,但我们进程没有发生错误的时候,我们主动给这个进程发信息,来模拟这个除零错误

    kill-8

    exit && _exit

    要终止一个进程,我们可以使用C语言提供的接口exit,在之前也见过,但我们这个exit()括号里面的数字,都不知道怎么填,一般都填的-1,有了本次知识的了解,我们就能知道,这个括号里面填的就是进程的退出码。

    image-20231026192418644

    exit在**main函数**里面和return是等价的,都可以返回进程的退出码;

    而在某个函数里面,exit也是表示当前进程直接退出,而return则指标是退出当前函数;

    使用,exit在任何地方都表示进程退出,而return只是在main函数里面表示进程退出

    系统也提供了一个接口_exit,它的功能也是直接终止进程,参数和返回值和exit一样

    image-20231026193208069

    exit_exit的区别:

    此篇文章之前提到过,关于缓冲区的概念,不了解的可以先看一下此篇文章:Linux进度条小程序_请揣满RMB的博客-CSDN博客

    我们来看这4段代码的执行结果:

    image-20231026204718435

    运行发现调用exit退出进程,会刷新缓冲区之后再终止进程;而_exit是直接退出进程。

    其实本质上exit在调用的时候,会先执行用户定义的一些清理函数,然后刷新缓冲区,最后再调用_exitexit_exit是一个调用与被调用的关系。

    image-20231026205515574

    这里我们也可以得出一个结论:缓冲区绝对不在内核区

  • 相关阅读:
    闲来无事,造了一个物联IOT平台
    香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试(三)
    第六章第二节:图的遍历(广度优先遍历和深度优先遍历)和应用(最小生成树、最短路径、有向无环图的描述表达式、拓扑排序、关键路径)
    法国乐天下单支付流程,自养号测评技术环境揭秘。
    基于java+SpringBoot+HTML+Mysql项目缺陷管理系统(软件测试管理)
    Linux 网络编程 广播/组播
    二十六、MySQL并发事务问题:脏读/不可重复读/幻读
    力扣刷题-链表-链表相交
    【TS】函数和函数类型
    web网页设计期末课程大作业 基于HTML+CSS+JavaScript响应式环保科技公司网站模板(环保主题网站设计)
  • 原文地址:https://blog.csdn.net/Dirty_artist/article/details/134064794