文档章节

atexit 函数

i
 iblackangel
发布于 2017/05/03 09:19
字数 302
阅读 10
收藏 0

按照 ISO C 的规定,一个进程可以登记多达 32 个函数,这些函数将由 exit 自动调用。我们称这些函数为终止处理函数 (exit handler),并调用 atexit 函数来登记这些函数。

#include <stdlib.h>

int atexit(void (*func)(void));

返回值:若成功则返回 0,或出错则返回非 0 值

其中,atexit 的参数是一个函数地址,当调用此函数时无需向它传送任何函数,也不期望它返回一个值。exit 调用这些函数的顺序与它们登记时候的顺序相反。同一函数如若被登记多次,则也会被调用多次。

atexit.c

#include <stdlib.h>

/* external declarations */
extern void (*_Atfuns[])(void);
extern size_t _Atcount;

int (atexit)(void (*func)(void)) /* function to call at exit */
{
    if (_Atcount == 0)
	    return (-1);
	_Atfuns[--_Atcount] = func; /* list is full */
	return (0);
}

exit.c

#include <stdio.h>
#include <stdlib.h>

/* macros */
#define NATS 32
/* static data */
void (*_Atfuns[NATS])(void) = {0};
size_t _Atcount = {NATS};

void (exit)(int status)           /* tidy up and exit to system */
{
	while (_Atcount < NATS) {
	    (*_Atfuns[_Atcount++])() ;
	}

	size_t ;
		
	for (i = 0; i < FOPEN_MAX; ++i)   /* close all files */
	    if (_Files[i])
		    fclose(_Files[i]);

	_Exit (status);
}

参考资料

[1] C 标准库.卢红星等译.人民邮电出版社
[2] UNIX 环境高级编程第 2 版.尤晋元等译.人民邮电出版社

© 著作权归作者所有

i
粉丝 0
博文 47
码字总数 14784
作品 0
广州
程序员
私信 提问
c语言中return与exit的区别

1,exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理...

赵西元
2012/10/13
0
0
linux中的exit

C标准定义了下面的退出函数: #include void exit(int status); void _Exit(int status); int atexit(void (*function)(void)); 函数功能介绍如下: void exit(int status) 该函数终止调用的...

I慕蓝
2016/06/25
0
0
exit()和_exit()使用详解

1.exit函数 使用exit函数,要包含头文件”stdlib.h”,函数的使用形式为”void exit(int status)”,参数status为退出进程时的状态,父进程将获得该状态值。C语言标准指定了EXITSUCCESS和EXI...

颓废的幻想者
2016/03/08
18
0
模块和包.atexit

简单介绍: 此模块儿常用来注册回调函数(sys.exitfunc只能注册一个回调函数),而且不支持参数,而atexit是基于sys.exitfunc来实现,把回调函数放到列表中,当程序退出时,按照先后顺序调用注册的回...

满满李
2016/02/25
17
0
GIT源码1.7.7中貌似的一个BUG,求解

我分析的 git -1.7.7。在前几天找入口函数时,就发现 exec_cmd.c中一个变量 没有free动作。 今天整理了测试环境。在main 入口增加了 atexit函数 。该函数如下: 但打印的结果argv0_path却是有...

中山野鬼
2012/03/16
644
4

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
今天
7
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
10
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
6
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
8
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部