exit和_exit,atexit的浅析

C++中的atexit函数和exit函数 一、exit()函数 函数声明:void exit(int state); exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关 阅读详情
首先,我们得了解进程的终止方式:
有8种方式使进程终止,其中前5种为正常终止,它们是
1:从 main 返回
2:调用 exit
3:调用 _exit 或 _Exit
4:最后一个线程从其启动例程返回
5:最后一个线程调用pthread_exit
异常终止有3种,它们是
6:调用 abort
7:接到一个信号并终止

8:最后一个线程对取消请求做出响应


一. exit()
所在头文件:stdlib.h(如果是”VC6.0“的话头文件为:windows.h)
功 能: 关闭所有文件,终止正在执行的进程。
exit(1)表示异常退出.这个1是返回给操作系统的。
exit(x)(x不为0)都表示异常退出;
exit(0)表示正常退出。
exit()的参数会被传递给一些操作系统,包括UNIX,Linux,和MS DOS,以供其他程序使用。
在这里,你不禁会问,return也可以结束,那它是否和exit一样呢?


接下来,看看exit()和return的区别:
按照ANSI C,在最初调用的main()中使用return和exit()的效果相同。
但要注意这里所说的是“最初调用”。如果main()在一个递归程序中,exit()仍然会终止程序;但return将控制权移交给递归的前一级,直到最初的那一级,此时return才会终止程序。return和exit()的另一个区别在于,即使在除main()之外的函数中调用exit(),它也将终止程序。

相信不少读者见过_exit()和_Exit();那他们的区别和联系又是否一样呢?

接下来看一看,exit和_exit的区别:
exit:#include<stdlib.h>
_exit:#include<unistd.h>
_exit()函数:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。
exit()函数与_exit()函数最大的区别就在于 exit()函数在调用 exit 系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件。


最后,我们来看看atexit
头文件:#include<stdlib.h>
功 能: 注册终止函数(即main执行结束后调用的函数)
用 法: void atexit(void (*func)(void));
注意:exit调用这些注册函数的顺序与它们 登记时候的顺序相反。同一个函数如若登记多次,则也会被调用多次。

(调用多次不是无限调用,一个程序中最多可以用atexit()注册32个处理函数)

读者可以在Linux下调用以下函数

#include <stdio.h>
#include <stdlib.h>
void exit_fn1(void)
{
printf("Exit function #1 called\n");
}
void exit_fn2(void)
{
printf("Exit function #2 called\n");
}
int main(void)
{

atexit(exit_fn1);

atexit(exit_fn2);
return 0;
}
读者可以试着自己调用,查看结果,以加深印象


不少读者在这里不禁会想,注册终止函数,那不是与虚构函数一样了么。那么虚构函数和它是否等价,不等价那调用顺寻又怎么调用呢?


与析构函数的调用顺序编辑
在atexit(f)调用之前被静态分配的对象的析构函数将在f()的调用之后被调用。在一个atexit(f)调用之后建立的这种对象的析构函数将在f的调用之前被调用。引自《The C++ Programming Language》



本文如果错误,请网友留言。

UNext:基于 MLP 的快速医学图像分割网络 有代码,可深入学习轻量级分割模型的论文切入点 UNet 及其最新扩展(如 TransUNet)近年来一直是领先的医学图像分割方法。然而,这些网络无法有效地用于应用中的快速图像分割,因为它们参数繁重、计算复杂且使用缓慢。为此,我们提出了 UNeXt,它是一种基于卷积多层感知器(MLP)的图像分割网络。我们以有效的方式设计了 UNeXt,其中包括早期卷积阶段和潜在阶段的 MLP 阶段。我们提出了一个标记化的 MLP 块,我们可以在其中有效地标记和投影卷积特征,并使用 MLP 来对表示进行建模。 阅读详情

相关推荐

超声波清洗机拆解实录:从电路板到换能器,一文看懂内部构造(附高清图)

本文详细拆解了超声波清洗机的内部构造,从电路板设计到换能器工作原理,揭示了其核心技术。通过高清图片和详细分析,展示了功率放大电路、高频变压器及压电换能器等关键部件,为电子爱好者和维修技术人员提供了实用的故障诊断和元件二次利用指南。

grape的博客 1183

C | atexit函数

欢迎关注公众号“三戒纪元”

RandyOliver's House 611

STM32控制舵机SG-5010转动,HAL库

首先设置时钟为72Mhz,预分频系数为72-1,自动重装载计数器的值为5000-1,这样的话就可以得到一个5ms的脉冲宽度,5000的计数值可以让舵机的旋转角度变得更加易控且相对精准,计算旋转角度的时候也可以更加精确。所以我们5ms脉宽,period是5000脉宽-------------角度----------pulse0.5ms-------------0度----------500;1.0ms------------45度---------1000;

qq_73783264的博客 1292

atexit()函数

1 #include<stdio.h> 2 #include<stdlib.h> 3 static void my_exit1(void); 4 static void my_exit2(void); 5 6 int main(void) 7 { 8 if(atexit(my_exit1)!=0)//登记顺序与调用顺序相反 9 { 10

qq_36935755的博客 232

sophgo sdk v23.03.01

C/C++程序建议在x86主机上使用交叉编译工具链编译生成可执行文件后,再拷贝到SoC目标平台运行。# 创建docker用户组,若已有docker组会报错,没关系可忽略。对于SoC模式,模型转换也需要在docker开发容器中完成;docker开发容器的配置参照前述章节相关内容。6、创建docker容器并进入Docker。# docker命令免root权限执行。# 将当前用户加入docker组。# 重启docker服务。# 安装 docker。3、安装docker。7、SoC 环境配置。

weixin_40723768的博客 913

终端效率神器:Tmux 安装与使用全指南

终端效率神器:Tmux 安装与使用全指南

身在被窝_心在编程 1358

atexit函数详解

#include <stdlib.h> int atexit(void (*func) (void)) ; 返回:若成功则为 0,若出错则为非 0 按照 A N S I C 的规定,一个进程可以登记多至 3 2 个函数,这些函数将由 e x i t 自动调用。我们 称 这 些 函 数 为 终 止 处 理 程 序 ( e x i t h a n d l e r ),并用 a t e x ...

weixin_43781183的博客 5569

Kali Linux渗透测试:蚁剑(AntSword)三种安装方法与避坑指南

WebShell管理是渗透测试与网络安全攻防演练中的关键技术环节,它允许安全人员在获得初步访问权限后,对目标系统进行文件管理、命令执行和数据库操作等深度控制。其核心原理是通过在Web服务器上植入特定脚本,建立一条隐蔽的远程管理通道。在实战中,一个高效、稳定的WebShell管理工具能极大提升后渗透阶段的工作效率与成功率。蚁剑(AntSword)作为一款功能强大的国产开源工具,凭借其插件化架构和图形化界面,成为众多安全研究人员的首选。本文将聚焦于如何在渗透测试专用操作系统Kali Linux上部署蚁剑,详细对

weixin_34413103的博客 414

atexit函数的使用

#include&lt;iostream&gt;#include&lt;stdlib.h&gt;#include&lt;string&gt;#include&lt;windows.h&gt;using  namespace  std;void fn1(void){ Sleep(1000); printf("fn1\n"); Sleep(1000);}void fn2(void){ Sleep(10...

MysteryCode_ABC的博客 359

173、LLC谐振变换器的PCB设计实战(布线)

LLC谐振变换器PCB设计实战要点 LLC谐振变换器的PCB设计核心在于控制寄生参数,避免高频振铃和EMI问题。功率回路需确保电流路径最短且紧耦合,谐振电容焊盘需加宽以减少发热。驱动走线应独立于功率回路,避免干扰,并合理控制宽度和长度。变压器绕组结构影响共模噪声,建议原边在外层并加屏蔽铜箔。地平面设计需根据功率等级选择整块或分割,大功率下功率地与信号地应单点连接。谐振电流采样推荐四端开尔文电阻以减少电感干扰。散热需优化铜皮和过孔布局,功率器件优先放置顶层。布局应先确定谐振腔,再排布控制电路。经验上需实测寄生

Jack010169的博客 46

具身智能机器人算法控制研究进展综述

具身智能(Embodied Intelligence)作为人工智能与机器人学的交叉前沿领域,强调智能体通过物理身体与环境的持续交互涌现智能行为。近年来,随着基础模型(Foundation Models)、扩散策略(Diffusion Policy)、视觉-语言-动作(Vision-Language-Action, VLA)模型以及大规模机器人数据集(如Open X-Embodiment)的快速发展,具身智能机器人的算法控制范式正经历深刻变革。

VectorShift的博客 229

17-atexit函数——进程终止

1. 终止函数   一般来说,内核中每个启动的进程默认都有一个标准的终止函数,用于在进程终止时执行的函数,该函数主要用来释放进程所占用的资源,也可以自定义终止函数,按照ISO C规定,一个进程可以注册32个终止函数,这些函数将由exit函数自动调用。   登记的终止函数以栈的形式运行,先注册的后执行。如果自定义注册了进程终止函数,那么内核提供的默认的终止函数将会被覆盖。   有同学可能会问...

网络安全 1856

【漏洞复现】用友NC-Cloud-反序列化-ResourceManagerServlet

NC Cloud是用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。NC Cloud完全基于云原生架构,技术先进、性能稳定、自主安全可控,支撑大中型以及超大型集团企业N层多site混合云部署方案,支持整个系统高可用、弹性扩展、双/多活,以及快速灾备恢复能力等。用友-NC-Cloud ResourceManagerServlet 接口存在反序列化漏洞,使得攻击者可以通过构造特定的请求远程执行恶意代码。此漏洞可能导致攻击者获取系统权限、执行任意命令,严重威胁系统的机密性和完整性。

漏洞复现 1366

浅析exit()和atexit()函数

当内核使用一个一个exec函数执行c程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序需将此例程指定为程序的起始地址。启动例程从内核获取命令行参数和环境变量,然后为调用mian函数做好准备。

One piece 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

浅析exit()和atexit()函数【转】

(转自:https://blog.youkuaiyun.com/wy1550365215/article/details/70216750) 当内核使用一个一个exec函数执行c程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序需将此例程指定为程序的起始地址。启动例程从内核获取命令行参数和环境变量,然后为调用mian函数做好准备。 exec函数说明: fork函数是用于创建一个子...

Uaena的博客 298

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

abort()、exit()、atexit使用

abort()、exit()、atexit\atexit使用 1. abort() 立即终止当前进程,产生异常程序终止 进程终止时不会销毁任何对象 示例: /* abort example */ #include &lt;stdio.h&gt; /* fopen, fputs, fclose, stderr */ #include &lt;stdlib.h&gt; ...

zt_xcyk的专栏 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[C++] 退出清理函数解读(exit、_exit、abort、atexit)

退出相关函数说明:在C++中,exit_exit(或_Exit)、abort和atexit是用于控制程序退出和清理的标准库函数。

wangdsh的博客 4931

多进程之进程退出函数:exit,_exit,atexit详解

关于进程推出的三个函数:exit,_exit,atexit,下面是关于这三个函数的作用与详解 exit函数: 函数原型: #include <stdlib.h> void exit(int status); 1.函数作用:用于进程退出使用,并可以给它一个无符号整型退出状态值,第八位有效(0-255),超出255将表示未定义退出状态值 2.函数形参:使用时给它一个无符号的整型数,并且要小于255 验证代码: ...

takashi77的博客 7141

atexit函数的执行顺序_浅析结束程序函数exit, _exit,atexit的区别

多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就 是用atexit()函数来注册程序正常终止时要被调用的函数。atexit()函数的参数是一个函数指针,函数指针...

weixin_30044149的博客 210

Exit, _exit, atexit 的区别联系

Exit, _exit, atexit 的区别联系: 一,进程终止有 5 种方式: 正常退出: •从 main 函数返回 •调用 exit •调用_exit 异常退出: •调用 abort •由信号终止 二, exit 和 _exit 区别: 和 exit 比较一下,exit()函数定义在 stdlib.h 中,而_exit()定义在 unistd.h 中, 注:exit()

虎皮猫大人 767

exit与atexit区别

exit与atexit区别  一、exit()函数        函数声明:void exit(int state);        exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexi

chenglinhust的专栏 1929

linux进程显示exit是怎么回事,linux 进程退出exit,_exit区别即atexit函数

一,进程终止有5种方式:正常退出:从main函数返回调用exit调用_exit异常退出:调用abort由信号终止二,exit和_exit区别: 关于_exit():#include void _exit(int status);#include void _Exit(int status);DESCRIPTIONThe function _exit() terminates the calling...

weixin_35403151的博客 1744

exit, _exit, _Exit,abort,atexit-->一直未注意atexit

转: http://blog.sina.com.cn/s/blog_5cec5bad0100b0x2.html http://blog.youkuaiyun.com/iefswang/article/details/7430775 http://blog.sina.com.cn/s/blog_605f5b4f0100x3v0.html http://baike.baidu.com/view/6

点滴在心 894

第五章_进程 : 函数exit、_exit和atexit

函数exit、_exit和atexit 函数exit和_exit 从图中可以看出,_exit 函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核的各种数据结构;exit 函数则在这些基础上做了一些小动作,在执行退出之前还加了若干道工序。exit() 函数与 _exit() 函数的最大区别在于exit()函数在调用exit 系统调用前要检查文件的打开情况,把文件缓冲区中的内容写回文件。也就是图中的“清理I/O缓冲”。 #include<stdlib.h> void exit

matafeiyanll的博客 528

进程的挂起,等待和退出(wait,waitpid,exit,_exit,atexit 等函数)

​ 大家好,这里是小缺,一名对嵌入式软件开发充满热情的探索者。这一篇文章主要内容是带大家了解进程的挂起,等待,退出等操作。包括wait,waitpid,exit,_exit,atexit 等函数 ​

BEIFEN13的博客 1536

Linux系统:进程终止的概念与相关接口函数(_exit,exit,atexit)

exit函数是 C 和 C++ 标准库中的一个重要函数,用于终止程序的执行,并返回一个退出状态码给父进程或操作系统。是 C 标准库中的一个函数,用于注册程序在正常终止时要执行的函数。通过atexit注册的函数只有程序通过exit或return从main函数中返回,或者调用_exit之外的终止函数时才会被调用。这里特别要注意的是, 当传入的错误码无法识别的时候strerror函数就会返回一个“Unknown error”的字符串。调用exit函数时程序会立即终止执行,后续的代码不会执行。

yue_2899799318的博客 1180
上一篇: 二叉树中两个节点的最近公共祖先节点方法全集
下一篇: 求二叉树中两个节点最远的距离
Csoul89757
博客等级 码龄10年 34粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值