libc: квирки DSS — возврат WRITE и лимит манипуляторов; тесты fdmax/fbench
- ESTEX WRITE ($14) на успехе возвращает DE=0, а НЕ счётчик записанного (вопреки докам; solid-c в своём fflush тоже отключил сравнение по счётчику) — write() теперь судит по CF/A: CF=0&A=0 → n, CF=0&A!=0 → ENOSPC/-1 - DSS выдаёт 8 манипуляторов (fd 2..9; fd 1 держит шелл под запущенный exe), а 9-й OPEN не возвращает 06h — ВЕШАЕТ систему; предохранитель _fd_guard: счётчик в open()/close(), отказ EMFILE без захода в DSS - tests/fdmax — эмпирика лимита (8 хендлов, затем EMFILE=6); tests/fbench — бенчмарк буферизации (floor 512-байтными read, оценка небуферизованного по 1-байтным, fgetc/fgets/fputc) - filetest расширен: raw-probe возврата write, сценарий r+ (чтение-запись-чтение с инвалидацией буфера), ungetc, fprintf Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* _fd_guard.h — предохранитель от исчерпания манипуляторов DSS
|
||||
* (НЕ публичный заголовок).
|
||||
*
|
||||
* Факт (MAME, DSS 1.71.57, тест fdmax 2026-07-06): DSS выдаёт максимум
|
||||
* 8 манипуляторов (fd 2..9), а 9-й OPEN не возвращает ошибку 06h
|
||||
* "Too many open files" — он ВЕШАЕТ систему. Поэтому libc считает
|
||||
* открытые манипуляторы сама и отказывает с EMFILE, не доводя до DSS.
|
||||
*
|
||||
* Счётчик в _fd_count.c: инкремент в open() (creat идёт через него),
|
||||
* декремент в close() на успешном пути.
|
||||
*/
|
||||
#ifndef _FD_GUARD_H
|
||||
#define _FD_GUARD_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define _FD_OPEN_MAX 8
|
||||
|
||||
extern uint8_t _fd_open_count;
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user