Наткнулся тут на странную ошибку в своем коде. Код достаточно банальный, просто читает файл из /proc. Покопался глубже и открыл вот такое поведение.
Если читать, скажем, /proc/cpuinfo
побайтно, байт за байтом, то все ожидаемо работает и мы вычитаем весь файл до конца. Такое же поведение наблюдаем и с /proc/self/cmdline
. Но если попробовать такой же трюк на /proc/sys/net/ipv4/ip_local_port_range
то нам удастся прочитать лишь первый байт – последующий вызов read()
вернет EOF.
Понятно, что за файлом стоит динамическая структура и вот это вот все, но мне оно выглядит как плохая реализация в Ядре. Если они уже решили достичь консистентности позволяя читать только файл целиком, то могли бы тут какую-то ошибку возвращать вместо EOF.
Прикол номер два. Казалось бы, вполне корректный жаба-код Files.readString(Path.of("/proc/sys/net/ipv4/ip_local_port_range"))
получается сломан. Через свою внутреннюю машинерию он начинает чтение с одного байта, без буфера.
Никакого упоминания про данную gotcha’у ни в мане, ни в документации Ядра я не нашел.