一、简介

一般情况下进程正常退出返回0,异常退出则返回相应的退出码。而一个程序一般的退出场景有以下三个:

  • 代码运行结束,结果正确
  • 代码运行结束,结果不正确
  • 代码异常终止

常见的进程退出方式有正常结束和异常退出

正常结束:

  • 1、main函数中执行return退出
  • 2、exit
  • 3、_exit

异常结束:

  • 1、ctrl + c,信号终止
  • 2、kill信号终止——
  • 3、abort()

不管进程是上述什么方法退出的,系统最后都会执行内核中的一段相同代码,这段代码用来关闭进程所打开的文件描述符,用来释放它所占用的内存和其他相关的资源。

二、exit函数与_exit函数

(1)退出码

首先我们来介绍以下退出码,我们知道程序如果出错,都会返回一个退出码,那么这些退出码是什么呢?

exit的函数中可以让我们使用的错误码只有0~255(八个比特位,退出码存放在第八到第十六位),其他位被标记了别的信息。比如程序是否正常退出,如果是异常退出,退出码它会指明是什么原因导致异常退出的。

(2)_exit函数(系统调用到内核执行)

是系统调用,直接返回内核,没有多余的东西。

在Linux下我们man _exit会得到关于_exit函数的手册信息,里面详细的包含了它的各种信息,我们来看一下它的简单信息:

#include <unistd.h>void _exit(int status);#include <stdlib.h>void _Exit(int status);
  • 其中status定义了进程的终止状态,父进程可以通过wait来获取该值,它是一个int,但是仅有8位可以被父进程所使用,所以我们执行_exit(-1)的时候,在终端执行$?它返回的值是255。

(3)exit函数

我们在Linux下使用man 3 exit即可得到exit函数的相关信息。

exit函数原型为:

#include <stdlib.h>void exit(int status);

其中的参数status和_exit中的参数是一样的,都表明了进程的终止状态。

exit函数所做的事情:

第一件事刷新输出缓冲区,接着在做一大堆事情,最后调用_exit函数,准确来说是下面三个事情。

  • 1、执行用户通过atexit或者_exit定义的清理函数。
  • 2、关闭所有打开的流,并且将所有的缓存数据写入。
  • 3、调用_exit函数进入内核。

举例说明:

我们在Linux下分别写下如下代码

①调用_exit函数:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{printf("haha");_exit(0);
}

②调用exit函数:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{printf("haha");exit(0);//此处与上面的代码不一样
}

结果如下:

①调用_exit函数:

②调用exit函数:

我们看到如上代码只是调用的函数不相同,因为exit函数由于会刷新缓冲区,所以会在屏幕上显示出来,而_exit函数直接进入内核,所以不会显示出来内容。

(4)exit函数与_exit函数的区别

三、return退出

return退出是一种非常常见的退出方式,我们一般执行return n即等于执行exit(n),这时因为我们在main运行结束的时候会将main的返回值当作exit的参数。

进程退出方法总结与exit函数_exit函数相关推荐

  1. exit()和_exit()函数

    进程就好比人一样有其生命,我们通过fork()函数来创建一个进程,那么我们又是如何来中止进程呢. 进程退出 1.在Linux中任何让一个进程退出 进程退出表示进程即将结束.在Linux中进程退出分为了 ...

  2. Linux下Exit和_exit函数说明

    exit和_exit函数都是用来终止进程的.当程序执行到exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB(进程控制块)在内的各种数据结构,并终止本进程的运行.但是,这两个函数是有区 ...

  3. exit和_exit函数

    1.exit函数 1 #include <stdlib.h> 2 void exit(int status); 3 功能:退出当前进程 4 参数: 5 status:退出状态,由父进程通过 ...

  4. exit函数 _exit()函数,孤儿进程,僵尸进程

    exit()函数 调用用 atexit() 注册的任何函数.这些函数在进程终止时应运行. 刷新所有打开的流,这样可以确保将缓冲数据写入相关文件. 关闭所有打开的文件描述符. 返回操作系统的控制,表示进 ...

  5. exit()与_exit()函数的区别

    注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...

  6. exit()与_exit()函数的区别(Linux系统中)

    注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...

  7. linux系统调用:exit()与_exit()函数详解【转】

    (转自:https://blog.csdn.net/drdairen/article/details/51896141) exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示 ...

  8. linux系统调用:exit()与_exit()函数详解

    exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_ ...

  9. Linux多任务编程之五:exit()和_exit()函数(转)

    来源:CSDN  作者:王文松   转自:Linux公社 ----------------------------------------------------------------------- ...

最新文章

  1. gzez某蒟蒻lyy的博客
  2. 如何选择IDC服务器托管服务商
  3. RabbitMQ liunx-centos 安装过程记录
  4. css tab 后竖线_H5网页布局+css代码美化,零基础参考
  5. 【java】JOptionPane的基本操作
  6. Python 实现单例模式的一些思考
  7. 俄罗斯方块C4droid
  8. 怎样能看懂matlab中的代码,初学者怎样能看懂代码
  9. python用cartopy包画地图_利用Cartopy绘制带有地图投影的图形
  10. 基于RPGMakerMV的JavaScript基础-5
  11. android自定义上拉刷新,Android RecyclerView自定义上拉和下拉刷新效果
  12. ToLua 入门07_GameObject
  13. html 排版标签、文本格式化标签、图像标签、链接标签、注释标签、路径、锚点定位、base文本标签、pre标签、特殊字符
  14. 一种更优雅的蓝牙配对技术 - Cross-transport key derivation (CTKD)
  15. BufferedWriter详解
  16. 【MySQL】16-超详细的MySQL单行函数汇总
  17. 蘑菇街收购锐鲨科技,志在押注国货新浪潮?
  18. SQL Pretty Printer美化SQL工具
  19. 前端加载高德离线地图的解决方案
  20. 【CC2530授课笔记】(11)超声波测距的原理及实现 (采用HC-SR04模块)

热门文章

  1. 制造企业质量成本管理中的问题与对策
  2. 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)
  3. 网络黑客攻防学习平台之基础关第一题
  4. 涉密信息系统口令管理制度
  5. java backbone_Backbone入门讲解
  6. 【uniapp】视频分享预览小程序
  7. 十年磨一剑,华为OceanStor Pacific再立海量存储标杆
  8. 网站安全狗V3.4版 让网站加速起来
  9. ASP.NET Identity简介
  10. phantomjs html格式转换工具使用简介