/* * _file_slot_take — найти свободный слот таблицы потоков и при первом * обращении взвести atexit(_fclosall), чтобы exit() сбрасывал * несброшенную запись всех потоков (требование стандарта). * Слот НЕ помечается занятым — вызывающий (fopen/fdopen) заполняет * поля и последним выставляет flags. */ #include /* atexit */ #include #include "_file.h" FILE *_file_slot_take(void) { static uint8_t atexit_armed; FILE *fp = _file_slots; for (uint8_t i = 0; ; i++, fp++) { if (i >= OPEN_MAX) { errno = EMFILE; return 0; } if (fp->flags == 0) break; } if (!atexit_armed) { atexit_armed = 1; atexit(_fclosall); } return fp; }