TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.51K subscribers
Post #662 174
name_to_handle_at() - как получить файловый объект без обычного пути

В 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
More from @bash_tex
  1. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
  2. Oct 1, 2026flock vs fcntl - почему две блокировки одного файла могут вести себя совершенно по-разному…
  3. Sep 30, 2026DEBUG trap - как Bash выполняет код перед каждой командой В Bash есть специальный DEBUG tr…
  4. Sep 29, 2026tee + process substitution: один поток и несколько получателей Иногда нужно одновременно:…
  5. Sep 28, 2026Архитектура большого bash-скрипта Пока скрипт на 30 строк - все терпимо. На 300 строк начи…
  6. Sep 25, 2026BashTex 📱 #мем
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →