В relibc появились блокировки диапазонов байт в fcntl
23.02.2026В relibc реализована побайтовая блокировка файлов: семейство F_SETLK и F_SETLKW, а также открытые дескрипторные F_OFD_SETLK и F_OFD_GETLK, которые не снимаются при закрытии дескриптора и не конфликтуют после fork.
Зачем блокировать часть файла
Обычная блокировка файла действует на него целиком. Побайтовая — на указанный диапазон смещения и длины. Это позволяет нескольким процессам работать с одним файлом: читать начало, дописывать в середину, читать конец, не мешая друг другу.
Без неё единственный способ разделить доступ — разные файлы или координация через отдельный файл-блокировку. Оба способа хуже: первый меняет формат данных, второй работает через файл, который тоже надо защитить.
Два семейства и разница между ними
Классические блокировки принадлежат процессу: они освобождаются при закрытии любого дескриптора на тот же файл и наследуются потомком после fork. Из этого следует неприятное: программа, разветвившаяся, держит блокировку в обоих процессах, и они начинают конфликтовать сами с собой.
Открытые дескрипторные блокировки принадлежат дескриптору, а не процессу. Они не снимаются при закрытии другого дескриптора и не наследуются потомком — то есть после fork ребёнок просто не держит блокировку родителя.
Это ровно та семантика, которая нужна программам, работающим с базами данных: блокировка держится ровно тем дескриптором, которым открыт файл.
Как это сделано
Поддержка проведена через весь стек: ядро, крейт redox-scheme и сама файловая система RedoxFS. В relibc первым появился F_SETLK 23 февраля, затем F_OFD_SETLK 24-го, а 25 февраля добавлены проверяющие варианты. В системе появилось также освобождение по закрытию дескриптора и хранение inode вместе с блокировкой для дескрипторных.
Что это даёт коду на Rust
В ночных сборках стандартной библиотеки появились File::lock и File::try_lock — они работают через fcntl с блокировкой диапазонов. Без поддержки в системе эти методы не могли работать.
Для крейтов, работающих с дескрипторами напрямую, а не через std::fs, семейство F_OFD_* — единственный способ получить правильную семантику при разветвлении процесса.
Оригинал
Коммит feat(redox/fcntl): F_SETLK от 23 февраля 2026 года в репозитории redox-os/relibc; F_OFD_SETLK от 24 февраля, F_OFD_GETLK от 25-го; поддержка в redox-os/redox-scheme и redox-os/redoxfs. Сводка «This Month in Redox — February 2026», раздел «Relibc Improvements»
Упоминаний: 1 · Просмотров: 2