进程退出方法总结与exit函数_exit函数
一、简介
一般情况下进程正常退出返回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函数相关推荐
- exit()和_exit()函数
进程就好比人一样有其生命,我们通过fork()函数来创建一个进程,那么我们又是如何来中止进程呢. 进程退出 1.在Linux中任何让一个进程退出 进程退出表示进程即将结束.在Linux中进程退出分为了 ...
- Linux下Exit和_exit函数说明
exit和_exit函数都是用来终止进程的.当程序执行到exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB(进程控制块)在内的各种数据结构,并终止本进程的运行.但是,这两个函数是有区 ...
- exit和_exit函数
1.exit函数 1 #include <stdlib.h> 2 void exit(int status); 3 功能:退出当前进程 4 参数: 5 status:退出状态,由父进程通过 ...
- exit函数 _exit()函数,孤儿进程,僵尸进程
exit()函数 调用用 atexit() 注册的任何函数.这些函数在进程终止时应运行. 刷新所有打开的流,这样可以确保将缓冲数据写入相关文件. 关闭所有打开的文件描述符. 返回操作系统的控制,表示进 ...
- exit()与_exit()函数的区别
注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...
- exit()与_exit()函数的区别(Linux系统中)
注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...
- linux系统调用:exit()与_exit()函数详解【转】
(转自:https://blog.csdn.net/drdairen/article/details/51896141) exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示 ...
- linux系统调用:exit()与_exit()函数详解
exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_ ...
- Linux多任务编程之五:exit()和_exit()函数(转)
来源:CSDN 作者:王文松 转自:Linux公社 ----------------------------------------------------------------------- ...
最新文章
- gzez某蒟蒻lyy的博客
- 如何选择IDC服务器托管服务商
- RabbitMQ liunx-centos 安装过程记录
- css tab 后竖线_H5网页布局+css代码美化,零基础参考
- 【java】JOptionPane的基本操作
- Python 实现单例模式的一些思考
- 俄罗斯方块C4droid
- 怎样能看懂matlab中的代码,初学者怎样能看懂代码
- python用cartopy包画地图_利用Cartopy绘制带有地图投影的图形
- 基于RPGMakerMV的JavaScript基础-5
- android自定义上拉刷新,Android RecyclerView自定义上拉和下拉刷新效果
- ToLua 入门07_GameObject
- html 排版标签、文本格式化标签、图像标签、链接标签、注释标签、路径、锚点定位、base文本标签、pre标签、特殊字符
- 一种更优雅的蓝牙配对技术 - Cross-transport key derivation (CTKD)
- BufferedWriter详解
- 【MySQL】16-超详细的MySQL单行函数汇总
- 蘑菇街收购锐鲨科技,志在押注国货新浪潮?
- SQL Pretty Printer美化SQL工具
- 前端加载高德离线地图的解决方案
- 【CC2530授课笔记】(11)超声波测距的原理及实现 (采用HC-SR04模块)