В 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