当我从atexit处理程序调用exit时,为什么不能获得无限循环?

时间:2013-12-07 20:42:24

标签: c atexit

该程序使用exit()注册一个调用atexit()的函数。

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

void machiavellian() {
    puts("At exit");
    exit(0);
}
int main(void) {
    atexit(machiavellian);
    exit(0);
}

来自man atexit

  

这些回调不得调用exit()

我正在等待一个无限循环,但相反,它只调用一次machiavellian()。会发生什么?

$ make you_cant_exit_me
cc     you_cant_exit_me.c   -o you_cant_exit_me
$ ./you_cant_exit_me 
At exit
$ echo $?
0

1 个答案:

答案 0 :(得分:3)

“这些回调不能调用exit()”并不意味着“如果这些回调调用exit(),将会发生特别有趣的事情”。它只是意味着“不要做,或者你自己做”。一个不同的POSIX兼容系统可能会做其他事情,比如无限循环。由于你没有遵守规则,你不能指望会发生什么。

(我认为很少,如果有任何系统会进入无限循环。避免这种情况是微不足道的,我无法想象它是一个有用的结果。)