atexit Function

20 篇文章 0 订阅

ISO C中,一个进程可以注册32个由exit自动调用的函数。这被称为exit handlers,可以通过调用atexit来注册。

atexit - register a function to be called at normal process termination

#include <stdlib.h>

int atexit(void (*function)(void));
//Returns: 0 if OK, nonzero on error

参数是需要注册的函数地址

注意点:

  1. 通过atexit注册的函数调用的时候,不传递任何参数,也不返回任何值
  2. exit调用这些函数的顺序,依照注册时候的相反顺序
  3. 每个函数被注册了几次就调用几次
  4. POSIX.1 扩展了ISO C标准,规定进程调用了任何exec系统调用,就会清除任何已安装的exit handlers

exit handler是ANSI C Standard在1989年提出的
ISO C需要系统支持至少32个exit handlers
通过sysconf可以来决定给定平台支持的exit handlers的最大数量

图例演示:

figure 7.2
我们知道,进程自愿终止的方法只有三种: _exit,_Exit and exit
不自愿的终止方法: signal(信号)
此外,内核执行程序的唯一方法就是调用exec

Example:演示atexit的使用

#include "apue.h"
static void my_exit1(void);
static void my_exit2(void);
int main(void)
{
    if (atexit(my_exit2) != 0) //注册exit2
        err_sys("can’t register my_exit2");
    if (atexit(my_exit1) != 0) //注册exit1
        err_sys("can’t register my_exit1");
    if (atexit(my_exit1) != 0) //注册exit1
        err_sys("can’t register my_exit1");
    printf("main is done\n");
    return(0);
}
static void my_exit1(void)
{
    printf("first exit handler\n");
}
static void my_exit2(void)
{
    printf("second exit handler\n");
}

运行后的结果如下:

$./a.out
main is done
first exit handler
first exit handler
second exit handler

可见执行顺序与注册顺序相反,且同一个exit handler注册几次,就调用几次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值