Получить имя файла по его дескриптору
От: Аноним  
Дата: 19.11.04 04:14
Оценка:
Приветствую,
возникла проблемка получения сабж. То есть я из своей .so библиотеки получаю дескриптор на файл вида FILE *in; надо как-то достучаться до имени файла, точнее директории где он лежит. В принципе .so библиотека обычно лежит в том же каталоге может как то из нее можно вытащить имя директории в которой она находиться, но как??? Надо под Linux, FreeBSD, Solaris, или хотя бы под Linux...
Re: Получить имя файла по его дескриптору
От: Chichikadze Израиль http://mika0x65.livejournal.com
Дата: 19.11.04 05:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Приветствую,

А>возникла проблемка получения сабж. То есть я из своей .so библиотеки получаю дескриптор на файл вида FILE *in; надо как-то достучаться до имени файла, точнее директории где он лежит. В принципе .so библиотека обычно лежит в том же каталоге может как то из нее можно вытащить имя директории в которой она находиться, но как??? Надо под Linux, FreeBSD, Solaris, или хотя бы под Linux...


А можно чуть подробнее? Не совсем понятно, что требуется -- найти директорию в которой лежит твоя .so или же на что указывает FILE *, полученный из твоей .so?
Re[2]: Получить имя файла по его дескриптору
От: RSNT  
Дата: 19.11.04 06:28
Оценка:
Здравствуйте, Chichikadze, Вы писали:

C>А можно чуть подробнее? Не совсем понятно, что требуется -- найти директорию в которой лежит твоя .so или же на что указывает FILE *, полученный из твоей .so?


Нужно определить директорию в которой находиться файл зная FILE * на файл.
Из полного пути к файлу я могу вытащить директорию так что можно просто полный путь к файлу на который укаывает FILE *.
Re: Получить имя файла по его дескриптору
От: aka50 Россия  
Дата: 19.11.04 06:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Приветствую,

А>возникла проблемка получения сабж. То есть я из своей .so библиотеки получаю дескриптор на файл вида FILE *in; надо как-то достучаться до имени файла, точнее директории где он лежит. В принципе .so библиотека обычно лежит в том же каталоге может как то из нее можно вытащить имя директории в которой она находиться, но как??? Надо под Linux, FreeBSD, Solaris, или хотя бы под Linux...


Ну дескриптор возвращается fileno(FILE*). Далее можно либо в /proc поиcкать (если прав хватит) либо fstat натравить... но к сожалению fstat
возвращает inode, а не имя файла (файл может быть уже удален, а inode еще иметь референсы, по этому смысла в имени файла мало).
Re[2]: Получить имя файла по его дескриптору
От: RSNT  
Дата: 19.11.04 06:43
Оценка:
Здравствуйте, aka50, Вы писали:

A>Ну дескриптор возвращается fileno(FILE*). Далее можно либо в /proc поиcкать (если прав хватит) либо fstat натравить... но к сожалению fstat

A>возвращает inode, а не имя файла (файл может быть уже удален, а inode еще иметь референсы, по этому смысла в имени файла мало).

А из inode можно вытащить имя директории?
Re[2]: Получить имя файла по его дескриптору
От: Chichikadze Израиль http://mika0x65.livejournal.com
Дата: 19.11.04 06:52
Оценка:
Здравствуйте, aka50, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>Приветствую,

А>>возникла проблемка получения сабж. То есть я из своей .so библиотеки получаю дескриптор на файл вида FILE *in; надо как-то достучаться до имени файла, точнее директории где он лежит. В принципе .so библиотека обычно лежит в том же каталоге может как то из нее можно вытащить имя директории в которой она находиться, но как??? Надо под Linux, FreeBSD, Solaris, или хотя бы под Linux...


A>Ну дескриптор возвращается fileno(FILE*). Далее можно либо в /proc поиcкать (если прав хватит) либо fstat натравить... но к сожалению fstat

A>возвращает inode, а не имя файла (файл может быть уже удален, а inode еще иметь референсы, по этому смысла в имени файла мало).

А разве при удалении файла st_nlink не будет равно 0?

В общем-то тоже подумал в сторону fileno, fstat, но кроме как обходить всю файловую систему в поисках дескриптора ничего в голову не лезет. Неужели нет другого способа?..
Re[3]: Получить имя файла по его дескриптору
От: aka50 Россия  
Дата: 19.11.04 08:28
Оценка: +1
Здравствуйте, Chichikadze, Вы писали:

C>Здравствуйте, aka50, Вы писали:


A>>Ну дескриптор возвращается fileno(FILE*). Далее можно либо в /proc поиcкать (если прав хватит) либо fstat натравить... но к сожалению fstat

A>>возвращает inode, а не имя файла (файл может быть уже удален, а inode еще иметь референсы, по этому смысла в имени файла мало).

C>А разве при удалении файла st_nlink не будет равно 0?


C>В общем-то тоже подумал в сторону fileno, fstat, но кроме как обходить всю файловую систему в поисках дескриптора ничего в голову не лезет. Неужели нет другого способа?..


Некоторого универсального способа нет:
http://groups.google.ru/groups?q=inode+to+filename&hl=ru&lr=&selm=3749C4EC.F4F26D2D%40yahoo.com&rnum=1

В частных случаях есть, например под FreeBSD есть системная тулза fstat. Исходники тут
Re: Получить имя файла по его дескриптору
От: Alex Alexandrov США  
Дата: 20.11.04 09:06
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

> Приветствую,

> возникла проблемка получения сабж. То есть я из своей .so библиотеки
> получаю дескриптор на файл вида FILE *in; надо как-то достучаться до
> имени файла, точнее директории где он лежит. В принципе .so библиотека
> обычно лежит в том же каталоге может как то из нее можно вытащить имя
> директории в которой она находиться, но как??? Надо под Linux, FreeBSD,
> Solaris, или хотя бы под Linux...

Некоторые мысли по этому поводу. Что есть дескриптор файла в *никсе? Это нечто однозначно соответствующее его i-node. Что есть i-node? Это нечто однозначно определяющее физическое местоположение данных файла и позволяющее обращаться к ним. Что есть имя файла? Это нечто позволящее по удобному символическому нику достучаться до i-node. Таких ников может быть сколько угодно — например, если у файла несколько хардлинков. Так что из i-node в общем случае ни директорию, ни имя файла получить не удастся — одному ноду может соответствовать несколько имен, выбрать один из которых не представляется возможным.

Задача, описанная в сообщении, может быть решена только если система ассоциирует имя файла, через которое открывался файл, с дескриптором FILE*. В общем, Get The Force — Read The Source.

-- Всего хорошего!
-- Alex Alexandrov, e-mail: alex_alexandrov(at)fromru(dot)com
Posted via RSDN NNTP Server 1.9 gamma
It's kind of fun to do the impossible (Walt Disney)
Re[2]: Получить имя файла по его дескриптору
От: Murr Россия  
Дата: 21.11.04 11:07
Оценка: 19 (3)
Здравствуйте, Alex Alexandrov, Вы писали:

AA>Некоторые мысли по этому поводу. Что есть дескриптор файла в *никсе? Это нечто однозначно соответствующее его i-node.


Вообще говоря, дескриптор — это нечто соответствующее имени файла в первую очередь ;т.к. это результат действия open над именем файла). Именно поэтому в Linux можно по дескриптору прочитать имя файла (readlink /proc/self/fd/%d)

Опять же возвращаясь к Linux — fd там соответсвует индексу массива ядра структур file. struct file — это поля, характерные для данного конкретного открытого файла (например, позиция в файле) + ссылка на dentry, dentry — это имя файла, ссылка на struct inode + ссылка на родительский dentry, struct inode же уже содержит представление в памяти всего, связанного с дисковым представлением файла, кроме его имени (на самом деле это не совсем так, Linux держит в памяти для каждой inode список всех dentry, на него ссылающихся) + все данные, связанные со всеми представлениями файла VFS (куда не входит, например, позиция в файле, поскольку она характерна для конкретного представления).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.