首页
学习
活动
专区
圈层
工具
发布

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()!

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

    带着问题看源码 —— 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 !

    64310

    Linux系统下进程编程(一)

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

    3.1K10

    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 );

    3.3K88

    干货 | 深度剖析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 );

    2.8K40

    进程终止

    进程终止的常见方法 在 Linux 系统中,进程终止的常见方法包括以下几种: 正常终止 正常终止指的是进程按照预期逻辑完成任务并退出,可以使用以下方式: return 语句 当 main() 函数执行...程序正常执行\n"); return 0; // 进程正常终止,返回码 0 } exit(n) exit() 函数是 C 标准库提供的进程终止函数,它执行以下操作: 执行 用户定义的清理函数(atexit...printf("使用 exit() 终止进程\n"); exit(0); // 进程正常终止,返回码 0 } _exit(n) _exit(n) 是 系统调用,它与 exit(n) 类似,但不会执行 atexit...printf("使用 _exit() 终止进程\n"); _exit(0); // 立即终止进程 } exit() 和 _exit() 的主要区别: 函数 刷新缓冲区 关闭文件描述符 调用 atexit...此外,进程退出码是 进程状态的反馈,在 Linux Shell 和 C 语言编程中都非常重要。

    93610
    领券