/* * atexit — зарегистрировать функцию, вызываемую при нормальном * завершении (exit()), максимум 8, порядок LIFO. Возвращает 0 или -1 * при переполнении стека хендлеров. * * ВОЗВРАТ ИЗ main ТОЖЕ РАЗМАТЫВАЕТ ЦЕПОЧКУ (с 2026-09-02), как и требует * стандарт C. Раньше crt0 уходил из main прямо в ESTEX EXIT, и хендлеры * не выполнялись: программа теряла и сброс файловых буферов (_fclosall), и * гашение звука, если не звала exit() явно. Теперь первая регистрация * ставит _atexit_hook, а crt0 его дёргает — см. _atexit_hook.c. */ #include #include "_atexit.h" int atexit(void (*fn)(void)) { if (_atexit_top >= ATEXIT_MAX) { return -1; } _atexit_stack[_atexit_top++] = fn; /* Хендлеры появились — значит crt0 обязан размотать цепочку и при * простом `return` из main. Ставим каждый раз: проверка дороже. */ _atexit_hook = _atexit_run; return 0; }