XeNoN
написал 8 марта 2006 года в 21:10 (1471 просмотр)
Ведет себя
как мужчина; открыл 2 темы в форуме, оставил 6 комментариев на сайте.
Мне нужно из программы на С/С++ узнать полный путь к ней.
Как это сделать?
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
argv[0] ?
К сожалению в argv[0] хранится строка запуска программы, т.е. если:
# /home/XeNoN/myprog — то argv[0] = /home/XeNoN/myprog
а если
# cd /gome/XeNoN
# ./myprog — то argv[0] = ./myprog
А мне надо полный путь к программе получить, в примере приведенном выше это /home/XeNoN/myprog
Есть один способ прочитать в /proc/self/maps, но это для Linux, а мне надо более переносимый вариант, если конкретно, то на FreeBSD.
Вообще задача и заключается в том чтобы перенести программу с Линукса на Фряху.
realpath(argv[0]) ?
Попробывал, не подходит realpath, она делает следующую операцию:
#realpath /usr/../bin
/bin
То есть избавляет от всякого вида перехлдов: ../ , ./.
Хотя извиняюсь. Если и вправду получить из argv[0] строку запуска, то realpath вернет полный путь.
myst, спасибо вам за ответ. Хотя есть еще много не решенных проблем в моей задаче, например узнать из динамически компонуемой библиотеки ее место нахождение на файловой системе. Но все равно благодаря вам одной проблемой меньше.
OMG! А это зачем?!
в общей ситуации невозможно.
http://www.erlenstar.demon.co.uk/unix/faq_toc.html#TOC23
я бы лучше использовал gecwd, она всё-таки посикс совместимая
Вобщем все оказалось намного сложнее, чем я думал.
Следующий код приведен из файла linux/prefix.cc программы linuxdc++ (http://linuxdcpp.berlios.de):
—————————————————————
/**
* br_locate:
* symbol: A symbol that belongs to the app/library you want to locate.
* Returns: A newly allocated string containing the full path of the
* app/library that func belongs to, or NULL on error. This
* string should be freed when not when no longer needed.
*
* Finds out to which application or library symbol belongs, then locate
* the full path of that application or library.
* Note that symbol cannot be a pointer to a function. That will not work.
*
* Example:
* --> main.c
* #include «prefix.h»
* #include «libfoo.h»
*
* int main (int argc, char *argv[]) {
* printf («Full path of this app: %s\n», br_locate (&argc));
* libfoo_start ();
* return 0;
* }
*
* --> libfoo.c starts here
* #include «prefix.h»
*
* void libfoo_start () {
* --> «» is a symbol that belongs to libfoo (because it’s called
* --> from libfoo_start()); that’s why this works.
* printf («libfoo is located in: %s\n», br_locate («»));
* }
*/
———————————————————————--
Разработчики программы только на словах пишут, что их программа для UNIX-like систем, а на самом деле для реализации вышепреведенного используют /proc/self/maps — похоже на карту памяти текущего процесса. Мало того, что они используют специфичную linux реализацию pthread, благо она доступна из портов FreeBSD, так еще и proc. Поэтому прикрутить к FreeBSD мне эту программу удалось, но только с использованием mount_linprocfs. И как я вижу простым путем реализовать функцию br_locate не удастся.
ты б, лучше описал зачем тебе это надо. Потому как, мне кажется, что должен быть другой способ. Но не представляя зачем это надо, сложно предложить этот способ. Напр. что тебе мешает, задавать местоположение программы/библиотек статически, скажем воспользовавшись сведениями полученными из ./configure ?
Или может не статически, а хранить пути в конфиге.
rgo, вы меня не поняли, как раз мне это не надо. Я тоже не вижу в этом огромного смысла. Я просто пытаюсь перенести linuxdc++ (http://linuxdcpp.berlios.de) на FreeBSD и поэтому только могу гадать зачем им — (разработчикам linuxdcpp ) приснилось динамически определять пути к программе. Я, по глупости своей, думал заменить их код на аналогичный, но переносимый, но теперь вижу, что такого кода скорее всего не существует, вернее существует, но он этого не стоит. Поэтому теперь всеми силами пытаюсь выяснить, зачем нужно динамически определять пути к библиотекам (хотя это нужно было сделать раньше), и избавить программу от этой необходимости.