在main开始前和结束后(转)
我们有两个C代码:
// entry.c #include <stdio.h> __attribute((constructor)) void before_main() { printf("%s\n",__FUNCTION__); } int main() { printf("%s\n",__FUNCTION__); } // atexit.c #include <stdio.h> void post(void) { printf("goodbye!\n"); } int main() { atexit(&post); printf("exiting from main\n"); }
分别编译运行这两个程序,输出结果分别为:
# entry.c before_main main # atexit.c exiting from main goodbye!
可见,在main开始前和结束后,其实还有一部分程序在运行。
事实上操作系统装载程序之后首先运行的代码并不是我们编写的main函数的第一行,而是某些运行库的代码,它们负责初始化main函数正常执行所需要的环境,并负责调用main函数,并且在main返回之后,记录main函数的返回值,调用atexit注册的函数,最后结束进程。以Linux的运行库glibc为例,所谓的入口函数,其实 就是指ld 默认的链接脚本所指定的程序入口_start (默认情况下)。
分类:
Linux
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2018-08-03 为什么采用4~20mA的电流来传输模拟量?(转)
2018-08-03 实用的4~20mA输入/0~5V输出的I/V转换电路(转)
2018-08-03 PT100高精度测温电路 AD623+REF3030(转)
2015-08-03 歪国人DIY的MINI四轴
2015-08-03 使用光学鼠标传感器实现旋转(或线性)测量(转)