URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7868
[ Назад ]

Исходное сообщение
"получение информации о файле"

Отправлено m_kostik , 29-Янв-09 21:58 
Здравствуйте, уважаемые знатоки!
Помогите мне найти правильное решение проблемы:
я знаю дескриптор файла (тот самый, который создается при помощи open(), create(), dup()и т.п.), теперь мне нужно определить все свойства файла, которому соответствует этот дескриптор. Функция fstat() возвращает структуру stuct stat, из которой можно установить номер файлового индекса (поле st_ino), тип файла, права доступа и кое-что еще. Но как зная номер файлового индекса получить доступ к структуре struct inode? Как определить полное имя файла? Что-то я никак не могу дойти. Дескриптор процесс получает как унаследованный от своего родителя, т.е. никаких дополнительных данных нет. Работаю в режиме пользователя

Содержание

Сообщения в этом обсуждении
"получение информации о файле"
Отправлено AMDmi3 , 29-Янв-09 22:36 
Никак в обоих случаях.

Полный путь никак, потому что путей у файла может быть от 0 до бесконечности.
Иноду никак, потому что иноды - это кишки файловой системы. В разных ФС инода может иметь совершенно разную структуру, равно как и ее может не быть вообще. Для этого и придумали слой VFS - всю информацию тебе уже вытащили в struct stat, и больше тебе никуда лезть не надо, а уж тем более задумываться об устройстве файловой системы.


"получение информации о файле"
Отправлено vic , 29-Янв-09 23:38 
>Здравствуйте, уважаемые знатоки!
>Помогите мне найти правильное решение проблемы:
>я знаю дескриптор файла (тот самый, который создается при помощи open(), create(),
>dup()и т.п.), теперь мне нужно определить все свойства файла, которому соответствует
>этот дескриптор. Функция fstat() возвращает структуру stuct stat, из которой можно
>установить номер файлового индекса (поле st_ino), тип файла, права доступа и
>кое-что еще. Но как зная номер файлового индекса получить доступ к
>структуре struct inode? Как определить полное имя файла? Что-то я никак
>не могу дойти. Дескриптор процесс получает как унаследованный от своего родителя,
>т.е. никаких дополнительных данных нет. Работаю в режиме пользователя

Как уже было сказано, в общем случае никак. Однако, в определенных случаях можно посмотреть на что указывает ссылка /proc/self/fd/<значение_дескриптора> с помощью readlink(). Результат будет - полный путь к файлу. Если файл открыт и удален, без закрытия, там же будет приписка "(Deleted)". Есс-но это будет корректно работать в пределах линуха.

Да, кстати, у открытого и удаленного файла нет пути вообще, и имени нет, но дескриптор валиден и валидны запись и чтение в него (и это нормально). Соответственно как в таком случае возможно в общем случае получение пути который был на момент открытия? - почти никак :)