首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

带着问题看源码 —— exit 如何调用 atexit 处理器

前言 之前在写 apue 系列的时候,曾经对系统接口的很多行为产生过好奇,当时就想研究下对应的源码,但是苦于 linux 源码过于庞杂,千头万绪不知从何开启,就一直拖了下来。...glibc exit 之前写过一篇介绍 linux 进程环境的文章(《 [apue] 进程环境那些事儿》),其中提到了 glibc exit 会主动调用 atexit 注册的处理器,且有以下特性: LIFO...,先进后出的顺序 注册几次调用几次 atexit 处理器中再次调用 exit 能完成剩余处理器的调用 atexit 处理器中再次注册的 atexit 处理器能被调用 下面带着这些问题,来看 glibc...也是通过调用 __cxa_atexit 实现的: int atexit (void (*func) (void)) { return __cxa_atexit ((void (*) (void...); ret = atexit (bye); if (ret !

26310
您找到你想要的搜索结果了吗?
是的
没有找到

CC++程序终止时执行的函数——atexit()函数详解

方法就是用atexit()函数来注册程序正常终止时要被调用的函数。   atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。...atexit()的函数原型是:#include intatexit(void(*func)(void));atexit()成功时返回零,失败时返回非零。   ...在一个程序中至少可以用atexit()注册32个处理函数(你至少可以32次,这依赖于你的编译器),这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。...这里需要纠正一下网上很多人的错误说法,他们说atexit()最多可以被调用32次,而实际上是atexit最少可以被调用32次。   函数说明:atexit()用来设置一个程序正常结束前调用的函数....\n");}main(){    atexit (my_exit);    exit(0);}   执行:before exit()!

2K20

Linux系统下进程编程(一)

另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。)来运行)加载器负责将这个程序加载到内存中去执行这个程序。...3、使用atexit注册进程终止处理函数,我们使用man手册来查看它的介绍: int atexit(void(*func)(void)); 注意:atexit()注册的函数类型应为不接受任何参数的void...函数,atexit的参数是一个函数地址(或者说是一个函数指针),当调用此函数(指的是atexit的参数 )时无须传递任何参数,该函数也不能返回值,atexit函数称为终止处理程序注册程序,注册完成以后。...它一般在Linux启动时开始执行,系统关闭时才结束。...所有的源代码可以到我的github里面获取:https://github.com/1121518wo/linux-/tree/master

2.5K10

C语言的main函数解析

linux下我们可以使用shell命令:echo $? 查看函数的返回值。...while(envp[i++])     {         printf("%s ", envp[i]);     }     return 0; } 运行结果:部分截图 envp[] 获得的信息等同于Linux...为什么说main()是程序的入口 linux系统下程序的入口是”_start”,这个函数是linux系统库(Glibc)的一部分,当我们的程序和Glibc链接在一起形成最终的可执行文件的之后,这个函数就是程序执行初始化的入口函数...atexit函数 原形: int atexit(void (*func)(void));  atexit 函数可以“注册”一个函数,使这个函数将在main函数正常终止时被调用,当程序异常终止时,通过它注册的函数并不会被调用...注册的函数的执行顺序:先注册的后执行     atexit( fn0 );       atexit( fn1 );       atexit( fn2 );       atexit( fn3 );

2.6K88

干货 | 深度剖析C语言的main函数

linux下我们可以使用shell命令:echo $? 查看函数的返回值。...envp[] 获得的信息等同于Linux下env命令的结果。...为什么说main()是程序的入口 linux系统下程序的入口是”_start”,这个函数是linux系统库(Glibc)的一部分,当我们的程序和Glibc链接在一起形成最终的可执行文件的之后,这个函数就是程序执行初始化的入口函数...atexit函数 原形: int atexit(void (*func)(void)); atexit 函数可以“注册”一个函数,使这个函数将在main函数正常终止时被调用,当程序异常终止时,通过它注册的函数并不会被调用...注册的函数的执行顺序:先注册的后执行 atexit( fn0 ); atexit( fn1 ); atexit( fn2 ); atexit( fn3 );

1.9K40
领券