main函数之后的调用

很多C/C++初学者都有一个固定认知:main函数return,程序就结束了。

其实不对!main返回只是代表主函数执行完毕,进程的收尾工作,由C运行库CRT接管, atexit 注册的回调函数,就是在 main 结束之后才执行。

示例代码

#include<stdlib.h>

#include<stdio.h>

void fn1(void);

void fn2(void);

int main(void)

{

atexit(fn1);

atexit(fn2);

printf("main exit...\n");

return 0;

}

void fn1()

{

printf("calling fn1()...\n");

}

void fn2()

{

printf("calling fn2()...\n");

}

运行输出

main exit...

calling fn2()...

calling fn1()...

核心知识点

  1. 调用顺序:后进先出(栈的顺序)
  • 先注册 fn1 ,再注册 fn2

  • main结束后,后注册的先执行:先跑fn2,再跑fn1

  • 最多可以注册32个atexit回调函数

  1. 执行时机:main函数return之后,进程真正销毁之前

main 函数里的 return 0 ,只是从主函数返回,并不是进程直接退出。CRT启动代码拿到main返回值之后,才会依次调用atexit注册的清理函数,全部执行完成,才会调用系统调用,结束进程。

  1. 重要限制:只有【正常终止】才会执行atexit回调

✅ 触发场景:main正常return、代码调用 exit()

❌ 不会触发: Ctrl+C 信号终止、 _exit() 、kill -9、程序崩溃段错误。

如果按下Ctrl+C想执行清理函数,需要手动捕获SIGINT信号,在信号处理函数内部调用exit(),才会触发atexit。

实际开发用处

atexit 适合做程序退出时的资源清理:关闭文件句柄、释放全局堆内存、保存配置、日志刷盘。

注意:工业嵌入式程序慎用,信号异常退出时atexit不会跑,关键资源清理不能只依赖它。

相关推荐
zhizhizhuzhuxia1 小时前
情感解说短视频的配音选型:从工程视角看情感音色与批量出片
人工智能·音视频
YOLO数据集集合1 小时前
光伏组件异常检测数据集 | 光伏组件 异常检测 红外检测 热斑识别 光伏巡检9147期
人工智能·yolo·目标检测·语言模型·太阳能板·光伏组件
HIT_Weston1 小时前
242、【AI】【模型部署】基座模型研究:注意力机制深入
人工智能·模型部署
智碳能碳管理平台1 小时前
碳排放核算软件选型:历史台账断层补救与锁账回放实操指南
人工智能·数字孪生·能碳管理系统·智碳能碳管理平台·企业能碳管理系统·碳排放核算软件·绿色工厂申报saas
知识分享小能手1 小时前
C++ 学习教程,从入门到精通,C++ 友元、异常和其他特性 — 详细知识点(15)
开发语言·c++·学习
IT_陈寒2 小时前
SpringBoot自动配置坑了我一把,原来是这样绕过去的
前端·人工智能·后端
hahaha60162 小时前
Shades-of-Gray (SoG) 算法--白平衡算法
人工智能·嵌入式硬件·算法·计算机视觉
海宇大数据2 小时前
零信任架构实战:基于海宇活体识别V步骤1构建自动化远程公证会话初始化网关
运维·人工智能·架构·自动化
Latchh2 小时前
前端导出的JPEG红字发糊,质量要拉到100才清楚
前端·图像处理·人工智能·计算机视觉