首页 > 解决方案 > 如果在 atexit 处理程序内部发生退出会发生什么?

问题描述

我知道 atexit 用于注册函数处理程序。然后,当代码中出现退出时,调用该函数。但是如果函数处理程序内部发生退出怎么办?

我期待一个无限循环,但实际上程序正常退出。为什么?

void handler(){
    printf("exit\n");
    exit(1);
}

int maint(int argc, char *argv[]) {
    atexit(handler);
    exit(1);
}

标签: c

解决方案


行为未定义。

7.22.4.4 退出函数

2 exit 函数导致程序正常终止。不调用 at_quick_exit 函数注册的函数。如果程序多次调用 exit 函数,或者在 exit 函数之外调用 quick_exit 函数,则行为未定义。

调用处理程序(exitat_exit正常的退出处理期间运行)绝对是第二次退出调用。

正常退出是一种可能的行为,但看到任何事情都可能发生(行为的性质未定义),它很可能会导致灾难。最好不要这样做。


推荐阅读