Авторский канал для тех, кто хочет глубже погрузиться в мир Linux.
Подойдет для разработчиков, системных администраторов и DevOps
Реклама: @dad_admin
Post #662
173
name_to_handle_at() - как получить файловый объект без обычного пути
В Linux обычно обращаются к файлу через путь:
Но ядро умеет работать с файловым объектом иначе. Системный вызов
Это используется низкоуровневыми инструментами, которым нужно сохранить ссылку на объект, а не его текстовый путь.
▪️Получаем handle
Сам системный вызов выглядит примерно так:
Например, программа может передать:
и получить структуру с handle и идентификатором mount.
Важно: это не файловый дескриптор. Handle не позволяет просто сделать
▪️Зачем тогда он нужен
Основная идея - получить устойчивое представление объекта внутри filesystem, которое затем можно использовать для повторного обращения к нему.
Для этого существует парный системный вызов:
Схема получается такой:
То есть сначала filesystem выдаёт идентификатор объекта, а позже по нему можно снова получить FD.
▪️Почему это отличается от обычного пути
Представим:
Путь зависит от directory entries. Файл могут переименовать:
Сам inode при этом остаётся тем же объектом.
File handle предназначен именно для работы с объектом filesystem, а не с конкретным именем в каталоге.
▪️Но есть важное ограничение
Handle не является универсальным идентификатором любого файла на всех filesystem.
Его формат зависит от filesystem, а поддержка механизма должна быть реализована самой filesystem.
Кроме того,
▪️Где это реально встречается
Механизм особенно интересен для низкоуровневых инструментов резервного копирования, мониторинга и работы с filesystem, где обычный путь может быть неудобен или недостаточно надёжен.
И главное:
Он просит конкретную filesystem предоставить handle для объекта, а затем этот handle может быть использован через соответствующий kernel API.
BashTex 📱 #bash #utils
В Linux обычно обращаются к файлу через путь:
/etc/hosts
Но ядро умеет работать с файловым объектом иначе. Системный вызов
name_to_handle_at() позволяет получить специальный file handle, связанный с объектом filesystem.Это используется низкоуровневыми инструментами, которым нужно сохранить ссылку на объект, а не его текстовый путь.
▪️Получаем handle
Сам системный вызов выглядит примерно так:
int name_to_handle_at(
int dirfd,
const char *path,
struct file_handle *handle,
int *mount_id,
int flags
);
Например, программа может передать:
/etc/hosts
и получить структуру с handle и идентификатором mount.
Важно: это не файловый дескриптор. Handle не позволяет просто сделать
read().▪️Зачем тогда он нужен
Основная идея - получить устойчивое представление объекта внутри filesystem, которое затем можно использовать для повторного обращения к нему.
Для этого существует парный системный вызов:
open_by_handle_at()
Схема получается такой:
path
↓
name_to_handle_at()
↓
file handle + mount ID
↓
open_by_handle_at()
↓
file descriptor
То есть сначала filesystem выдаёт идентификатор объекта, а позже по нему можно снова получить FD.
▪️Почему это отличается от обычного пути
Представим:
/var/data/report
Путь зависит от directory entries. Файл могут переименовать:
mv /var/data/report /var/archive/report
Сам inode при этом остаётся тем же объектом.
File handle предназначен именно для работы с объектом filesystem, а не с конкретным именем в каталоге.
▪️Но есть важное ограничение
Handle не является универсальным идентификатором любого файла на всех filesystem.
Его формат зависит от filesystem, а поддержка механизма должна быть реализована самой filesystem.
Кроме того,
open_by_handle_at() требует соответствующих привилегий. Обычное приложение не получает возможность произвольно открывать объекты по filesystem handles.▪️Где это реально встречается
Механизм особенно интересен для низкоуровневых инструментов резервного копирования, мониторинга и работы с filesystem, где обычный путь может быть неудобен или недостаточно надёжен.
И главное:
name_to_handle_at() не «обходит filesystem по inode».Он просит конкретную filesystem предоставить handle для объекта, а затем этот handle может быть использован через соответствующий kernel API.
BashTex 📱 #bash #utils
- 👍 4


