Почему я не получаю бесконечный цикл при вызове exit из обработчика 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 ответ

Решение

"Эти обратные вызовы не должны вызывать exit()" не означает "Если эти обратные вызовы вызывают exit(), будут происходить особые интересные вещи". Это просто означает "не делай этого, или ты сам по себе". Возможно, что другая POSIX-совместимая система сделает что-то еще, например, бесконечный цикл. Поскольку вы не следовали правилам, вы не можете рассчитывать на то, что произойдет.

(Хотя я бы предположил, что немногие, если какие-либо системы попадут в бесконечный цикл, избежать этого тривиально, и я не могу представить, что это полезный результат.)

Другие вопросы по тегам