nixp.ru v3.0

18 января 2017,
среда,
04:47:01 MSK

DevOps с компанией «Флант»
XeNoN написал 8 марта 2006 года в 21:10 (824 просмотра) Ведет себя как мужчина; открыл 2 темы в форуме, оставил 6 комментариев на сайте.

Мне нужно из программы на С/С++ узнать полный путь к ней.

Как это сделать?

myst

argv[0] ?

XeNoN

К сожалению в 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.

Вообще задача и заключается в том чтобы перенести программу с Линукса на Фряху.

myst

realpath(argv[0]) ?

XeNoN

Попробывал, не подходит realpath, она делает следующую операцию:

#realpath /usr/../bin

/bin

То есть избавляет от всякого вида перехлдов: ../ , ./.

XeNoN

Хотя извиняюсь. Если и вправду получить из argv[0] строку запуска, то realpath вернет полный путь.

myst, спасибо вам за ответ. Хотя есть еще много не решенных проблем в моей задаче, например узнать из динамически компонуемой библиотеки ее место нахождение на файловой системе. Но все равно благодаря вам одной проблемой меньше.

myst
узнать из динамически компонуемой библиотеки ее место нахождение на файловой системе

OMG! А это зачем?!

rgo
XeNoN
Мне нужно из программы на С/С++ узнать полный путь к ней.

Как это сделать?

в общей ситуации невозможно.

http://www.erlenstar.demon.co.uk/unix/faq_toc.html#TOC23

Fatal
myst
realpath(argv[0]) ?

я бы лучше использовал gecwd, она всё-таки посикс совместимая

XeNoN

Вобщем все оказалось намного сложнее, чем я думал.

Следующий код приведен из файла 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 не удастся.

rgo

ты б, лучше описал зачем тебе это надо. Потому как, мне кажется, что должен быть другой способ. Но не представляя зачем это надо, сложно предложить этот способ. Напр. что тебе мешает, задавать местоположение программы/библиотек статически, скажем воспользовавшись сведениями полученными из ./configure ?

Или может не статически, а хранить пути в конфиге.

XeNoN

rgo, вы меня не поняли, как раз мне это не надо. Я тоже не вижу в этом огромного смысла. Я просто пытаюсь перенести linuxdc++ (http://linuxdcpp.berlios.de) на FreeBSD и поэтому только могу гадать зачем им — (разработчикам linuxdcpp ) приснилось динамически определять пути к программе. Я, по глупости своей, думал заменить их код на аналогичный, но переносимый, но теперь вижу, что такого кода скорее всего не существует, вернее существует, но он этого не стоит. Поэтому теперь всеми силами пытаюсь выяснить, зачем нужно динамически определять пути к библиотекам (хотя это нужно было сделать раньше), и избавить программу от этой необходимости.

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.