设为首页 加入收藏

TOP

Linux/Windows中atexit实现机制
2014-11-24 12:02:46 来源: 作者: 【 】 浏览:0
Tags:Linux/Windows atexit 实现 机制

想起atexit的实现是怎么个原理。


于是就写了简单的函数来调查。


#include


#include


#include



void show1(void)


{


printf("This is in show1\n");


return;


}


void show2(void)


{


printf("This is in show2\n");


return;


}


int main()


{


atexit(show1);


atexit(show2);


printf("This is in main\n");


return 0;


}


在Windows中,用的是vs2005调试。阅读汇编代码,发现


在Windows中,是把每一次注册的函数放在一个地址,然后每当再注册一个一个函数时,则把该地址加4。


这样当函数执行完main函数返回时,先于基地址比较,如果不相等,然后再取出该地址中的函数地址,比较是否为0,


如果为NULL,则继续,如果不为NULL,则执行该地址的函数。



在Linux中(UBT中9.**),采取了不同的机制。


在Linux中,存放了一个计数器。先判断是否为该计数器是否为0。


如果为0,则表示没有注册函数。


如果大于0,则说明有注册函数。


另外在Linux中,注册函数是存放在一个大小为16字节的结构体中,每个结构体有一个成员是注册函数地址。


struct atexit_fn {


int fn_type; /* ATEXIT_ from above */


union {


void (*std_func)(void);void (*cxa_func)(void *);


#ifdef __BLOCKS__void (^block)(void);


#endif /* __BLOCKS__ */


}fn_ptr; /* function pointer */


void *fn_arg; /* argument for CXA callback */


void *fn_dso; /* shared module handle */


}


详细参考http://www.opensource.apple.com/source/Libc/Libc-763.11/stdlib/atexit-fbsd.c


另外今天顺便测试了一下,在Windows中,前65k字节是不能读写的。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux/Windows下静态lib和全局变.. 下一篇Linux学习笔记:pthread_getsched..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)