/* * fclose — закрыть поток: сбросить буфер (_file_sync), закрыть fd, * освободить буфер и слот таблицы. ВАЖНО: ошибки отложенной записи * вылезают именно здесь — проверять результат fclose у пишущих * потоков. Консольные псевдопотоки (stdin/stdout/stderr) распознаются * по флагам и успешно игнорируются. */ #include #include #include #include "_file.h" int fclose(FILE *fp) { #ifndef LIBC_NOCHECK if (!fp) { errno = EBADF; return EOF; } #endif if (fp->flags & (_F_CONIN | _F_CONOUT)) { return 0; } int rc = _file_sync(fp); /* сброс несброшенной записи */ if (close(fp->fd) < 0) rc = EOF; if (fp->buf) free(fp->buf); fp->flags = 0; /* слот свободен */ return rc; }