|
|
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
Такой вот совсем простой вопросец. Как из exeщника узнать в run time где он расположен? Тоесть относительно рута ("/"). Здесь не виндовоз, однако, так что $0 для shell или arg[0] в сишном коде не катит совсем. Ессесвенно `pwd` тоже вопроса не решает, так как я могу сей exeщник запустить откуда угодно. Даже имя в $0 может быть любым, так как на exeщник может быть линк (и даже не один!). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 06:46:19 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
andrushokТакой вот совсем простой вопросец. Как из exeщника узнать в run time где он расположен? Тоесть относительно рута ("/"). Здесь не виндовоз, однако, так что $0 для shell или arg[0] в сишном коде не катит совсем. Ессесвенно `pwd` тоже вопроса не решает, так как я могу сей exeщник запустить откуда угодно. Даже имя в $0 может быть любым, так как на exeщник может быть линк (и даже не один!). Самый надежный способ,IMHO, прочесть файл /proc/pid/cmdline. Формат такой: /path/to/elf,0,argv1,0,argv2,0 и т.д. Если нужно получить только полный путь к программе, то можно так (хотя возможно уже есть готовые функции): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. P.S. Раньше я был Somebody2 ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 09:20:32 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
Да, в принципе это не так просто делается. Если из скрипта, то можно попробывать такую комбинацию: 1) 'which $0', если там нет, то: 2) pwd + dirname $0 Если есть желание разобраться с линками, то readlink. Из программы, думаю можно сделать похожую процедуру, но лучше поискать готовые функции. Например в библиотеке popt была похожая функция, наверняка есть и другие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 10:05:51 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
FishingIsGoodДа, в принципе это не так просто делается. Вопрос был как получить свой полный путь из бинарника. С помощью getpid можно получить pid, в /proc/pid/cmdline прочесть полный путь к запущенному файлу, далее совсем несложной анализ. Так в чем проблема то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 10:37:58 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
Если приложение - только под *nix-ы, то лучше всего способ предложенный Somebody2 Если - кросс-платформное, то такой фокус не пролезет... Тогда придется делать что-то вроде: void main( int argc, char **argv, char **envp ) { for( int i = 0; envp != NULL; ++i ) { // Находим значения перменееных окружения <PWD> и <_>. /Unix/ // Совместно их анализируя можно узнать полный путь к приложению. // Если таких переменных - нет, то дербаним *argv[0] /MsWin/ cout << i << ": " << envp << "\n"; } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 10:57:54 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
Somebody2 FishingIsGoodДа, в принципе это не так просто делается. Вопрос был как получить свой полный путь из бинарника. С помощью getpid можно получить pid, в /proc/pid/cmdline прочесть полный путь к запущенному файлу, далее совсем несложной анализ. Так в чем проблема то? Извеняюсь, я не вам отвечал :-) Ваш способ несомненно сработает... но только под линуксом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 11:09:47 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
nik_xЕсли приложение - только под *nix-ы, то лучше всего способ предложенный Somebody2 Если - кросс-платформное, то такой фокус не пролезет... Тогда придется делать что-то вроде: void main( int argc, char **argv, char **envp ) { for( int i = 0; envp != NULL; ++i ) { // Находим значения перменееных окружения <PWD> и <_>. /Unix/ // Совместно их анализируя можно узнать полный путь к приложению. // Если таких переменных - нет, то дербаним *argv[0] /MsWin/ cout << i << ": " << envp << "\n"; } } Вообще говоря, в данном случае для кроссплатформенности, IMHO, лучше использовать условную компиляцию (#ifdef #else #endif). Дело в том, что в Linux, переменная окружения "_" в общем случае может содержать название родительского, а не текущего процесса, а PWD может быть изменена родителем, что несколько усложнит анализ. 2FishingIsGood Ну из вопроса собственно следовало, что речь идет именно о Unix (уж не о Виндовс это точно) и скорее всего о Линукс (судя по другим постам автора вопроса) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 11:27:53 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
Somebody2 FishingIsGoodДа, в принципе это не так просто делается. Вопрос был как получить свой полный путь из бинарника. С помощью getpid можно получить pid, в /proc/pid/cmdline прочесть полный путь к запущенному файлу, далее совсем несложной анализ. Так в чем проблема то? /proc не везде есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 11:35:00 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
miniСЛОН Somebody2 FishingIsGoodДа, в принципе это не так просто делается. Вопрос был как получить свой полный путь из бинарника. С помощью getpid можно получить pid, в /proc/pid/cmdline прочесть полный путь к запущенному файлу, далее совсем несложной анализ. Так в чем проблема то? /proc не везде есть У автора вопроса, я уверен, есть Так в чем проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 11:38:59 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
[quot v6y2FishingIsGood Ну из вопроса собственно следовало, что речь идет именно о Unix (уж не о Виндовс это точно) и скорее всего о Линукс (судя по другим постам автора вопроса)[/quot] Да я ж и сказал, что на линуксе работать будет, и ничего против такого подхода не имею. Просто я лично стараюсь писать так, что бы при возможности оно работало и на других UNIX'ах. Ведь на то нам грешным и дан POSIX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 11:40:29 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
v6y miniСЛОН /proc не везде есть У автора вопроса, я уверен, есть Так в чем проблема? На основании чего делаются такие выводы? В той же солярке -- вы поручитесь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 13:11:00 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
DocAl v6y miniСЛОН /proc не везде есть У автора вопроса, я уверен, есть Так в чем проблема? На основании чего делаются такие выводы? В той же солярке -- вы поручитесь? На основании предыдущих постов, отсутствии ссылки на конкретную ОС в вопросе и наконец на основании названия данного форума, я сделал вывод что у автора Линукс Переменные окружения здесь использовать неправильно (ибо они могут быть изменены порождающим процессом), IMHO, argv[0] тоже вещь не надежная, Cканировать текущую директорию? А где гарантия, что в текущей директории нет другого файла с таким же именем? Тоже отпадает. Что остается? Использовать особенности конкретной ОС (ОС здесь - это Операционная Система, а не большой желтый мух ), а в случае кроссплатформенности условную компиляцию. Все вышесказанное IMHO. P.S. А я то думал я один такой странный, кому сегодня не бухается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 13:38:08 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
Спасибо всем - бум проверять. Что касаемо OS меня интересует тольки линух (шапка производственая и федорино горе) и солярка (начиная с 8-й). С виндовозом проще, но мне туда не надо... =) Отставному Somebody2 персональное спасибо за коде. А в целом задачка така. Есть некий набор программ (tool kit) который чой-то делает. До этого просто в /etc кидался некий conf, который любая апликуха читала и знала, где какие файлы расположены (другие настройки взять, или какой еще ехещник дернуть). Но вот пришло новое требование - чтоб могли работать 2 и более сих kitов на одном боксе. Ну прям как оракл =). Есть конечно путь завести некий MYKIT_HOME и настроить соответсвенно апача. Но не красива будет, с учетом, что клиент туп (да еще и прав всегда) потом не разгребешь, что где он не так настроил. Ну что посмотрим, как работает сие... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 21:09:34 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
Да, проверил. Не работат. Ну не совсем, конечно. 1) Если линк - дается путь к линку (и имя линка) 2) Если я запускаю (линк или сам файл - все равно) из под какой-нибудь относительной под-директории (тоесть в пути есть "..") показывается относительный путь, а не от рута. Так, что пока не годится, однако... Все равно всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 22:12:06 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
И еще один момент - на солярке (8-й) доступ к /proc только у рута. Что ставит крест на сем пути окончательный... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 22:21:43 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
Ну ладно - раз уж помучился уже, то можно рассказать, как это делается на самом деле :-) Есть такая функция realpath. Код: plaintext 1. Она делает примерно то, что я описал в алгоритме: сперва проверяет PATH, а потом разбирает имя файла. Линки она тоже резолвит. Так, что она выдаёт именно то что тебе надо. PS. Извеняюсь, вчера эта функция у меня что то из головы вылетела :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 23:37:06 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
Вот спасибочки - то, что надо ! Пока, правда на линухе проверил пока, но думаю, на солярке попрет. И линки разобрал, однако... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2005, 01:11:53 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
Да, ошибочка небольша (наверно, чтоб совсем чайники не сперли =) Надоть Код: plaintext 1. 2. Правда сие g++ 3.4.2 выловил, может на ранних и проскакивало... хотя, не думаю. Еще замечание про солярку - тама в /proc все pidы c d--x--x--x стоят. Так, что тетеретически можно им chmod сделать (создаются они от того юзверя, что процесс пусканул, так что не проблема) и дальше посмотреть. Но щас сие уже не актуально... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2005, 01:18:50 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
andrushokДа, ошибочка небольша (наверно, чтоб совсем чайники не сперли =) Да разумеется. Первая строчка имелась в виду: char* real_path = new char[PATH_MAX] Кстати функция меняет второй параметр (если не ошибаюсь), поэтому нет необходимости приравнивать к чему нибудь. На других UNIX'ах она тоже должна работать, потому как - это часть "Single UNIX specification". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2005, 05:00:31 |
|
||
|
А где файло то...
|
|||
|---|---|---|---|
|
#18+
Насчет cmdline я погорячился. Там будет тоже что и в argv[0]. Но тем не менее в общем случае нельзя на argv[0] надеятся и уповать. Например: execl("programm","hren_znaet_chto",arg1,..,argn,NULL) Если в programm использовать argv[0], то оно будет содержать hren_znaet_chto. Если такая ситуация исключена, то конечно лучше использовать argv[0], в противном случае под Линукс предлагаю такой вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2005, 07:39:15 |
|
||
|
|

start [/forum/topic.php?fid=25&msg=32949910&tid=1490916]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
160ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 503ms |

| 0 / 0 |
