Приветствую,
возникла проблемка получения сабж. То есть я из своей .so библиотеки получаю дескриптор на файл вида FILE *in; надо как-то достучаться до имени файла, точнее директории где он лежит. В принципе .so библиотека обычно лежит в том же каталоге может как то из нее можно вытащить имя директории в которой она находиться, но как??? Надо под Linux, FreeBSD, Solaris, или хотя бы под Linux...
Здравствуйте, Аноним, Вы писали:
А>Приветствую, А>возникла проблемка получения сабж. То есть я из своей .so библиотеки получаю дескриптор на файл вида FILE *in; надо как-то достучаться до имени файла, точнее директории где он лежит. В принципе .so библиотека обычно лежит в том же каталоге может как то из нее можно вытащить имя директории в которой она находиться, но как??? Надо под Linux, FreeBSD, Solaris, или хотя бы под Linux...
А можно чуть подробнее? Не совсем понятно, что требуется -- найти директорию в которой лежит твоя .so или же на что указывает FILE *, полученный из твоей .so?
Здравствуйте, Chichikadze, Вы писали:
C>А можно чуть подробнее? Не совсем понятно, что требуется -- найти директорию в которой лежит твоя .so или же на что указывает FILE *, полученный из твоей .so?
Нужно определить директорию в которой находиться файл зная FILE * на файл.
Из полного пути к файлу я могу вытащить директорию так что можно просто полный путь к файлу на который укаывает FILE *.
Здравствуйте, Аноним, Вы писали:
А>Приветствую, А>возникла проблемка получения сабж. То есть я из своей .so библиотеки получаю дескриптор на файл вида FILE *in; надо как-то достучаться до имени файла, точнее директории где он лежит. В принципе .so библиотека обычно лежит в том же каталоге может как то из нее можно вытащить имя директории в которой она находиться, но как??? Надо под Linux, FreeBSD, Solaris, или хотя бы под Linux...
Ну дескриптор возвращается fileno(FILE*). Далее можно либо в /proc поиcкать (если прав хватит) либо fstat натравить... но к сожалению fstat
возвращает inode, а не имя файла (файл может быть уже удален, а inode еще иметь референсы, по этому смысла в имени файла мало).
Здравствуйте, aka50, Вы писали:
A>Ну дескриптор возвращается fileno(FILE*). Далее можно либо в /proc поиcкать (если прав хватит) либо fstat натравить... но к сожалению fstat A>возвращает inode, а не имя файла (файл может быть уже удален, а inode еще иметь референсы, по этому смысла в имени файла мало).
Здравствуйте, 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, но кроме как обходить всю файловую систему в поисках дескриптора ничего в голову не лезет. Неужели нет другого способа?..
Здравствуйте, Chichikadze, Вы писали:
C>Здравствуйте, aka50, Вы писали:
A>>Ну дескриптор возвращается fileno(FILE*). Далее можно либо в /proc поиcкать (если прав хватит) либо fstat натравить... но к сожалению fstat A>>возвращает inode, а не имя файла (файл может быть уже удален, а inode еще иметь референсы, по этому смысла в имени файла мало).
C>А разве при удалении файла st_nlink не будет равно 0?
C>В общем-то тоже подумал в сторону fileno, fstat, но кроме как обходить всю файловую систему в поисках дескриптора ничего в голову не лезет. Неужели нет другого способа?..
Здравствуйте, Аноним, Вы писали:
> Приветствую, > возникла проблемка получения сабж. То есть я из своей .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)
Здравствуйте, 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 (куда не входит, например, позиция в файле, поскольку она характерна для конкретного представления).