我知道atexit用于注册函数处理程序。然后,当代码中退出时,将调用该函数。但是,如果在函数处理程序内部发生退出怎么办?
我期待一个无限循环,但实际上程序可以正常退出。为什么?
void handler(){ printf("exit\n"); exit(1); } int maint(int argc, char *argv[]) { atexit(handler); exit(1); }
查看更多
该行为是不确定的。
7.22.4.4退出功能 2退出功能导致正常程序终止。没有调用at_quick_exit函数注册的函数。如果程序多次调用退出函数,或者除退出函数外还调用quick_exit函数,则行为是不确定的。
7.22.4.4退出功能
2退出功能导致正常程序终止。没有调用at_quick_exit函数注册的函数。如果程序多次调用退出函数,或者除退出函数外还调用quick_exit函数,则行为是不确定的。
调用exit在一个at_exit处理程序(即出口的正常处理期间被运行)绝对是出口处的第二个呼叫。
exit
at_exit
正常退出是一种可能的行为,但是看到任何事情都会发生(行为的性质未定义),很可能会导致灾难。最好不要这样做。
(如果确实由于调用
exit
了at_exit
处理程序而调用了处理程序,则绝对是第二次调用,但是程序可以正常地调用该处理程序,在这种情况下,它将是第一次调用。但是随后将再次被调用,除非处理程序采用了不同的代码路径。)exit
exit
exit
@EricPostpischil好的,但是为什么不创建无限循环呢?该行为是不确定的,因此它可以创建循环,或者在这种情况下不能创建循环?
未定义表示未定义。它可以做任何事情,而问标准为何某件事发生或没有发生是没有意义的。您只能问为什么您的实现会做某件事,而答案几乎总是“因为它做了”。