powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / А где файло то...
20 сообщений из 20, страница 1 из 1
А где файло то...
    #32949900
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой вот совсем простой вопросец. Как из exeщника узнать в run time где он расположен? Тоесть относительно рута ("/"). Здесь не виндовоз, однако, так что $0 для shell или arg[0] в сишном коде не катит совсем. Ессесвенно `pwd` тоже вопроса не решает, так как я могу сей exeщник запустить откуда угодно. Даже имя в $0 может быть любым, так как на exeщник может быть линк (и даже не один!).
...
Рейтинг: 0 / 0
А где файло то...
    #32949910
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

main() {
 pid_t pid=getpid();
 char buf[ 256 ];
 char wd[ 256 ];
 FILE *f;

 snprintf(buf,sizeof(buf)- 1 ,"/proc/%u/cmdline",pid);
 f=fopen(buf,"r");
 if (f) {
  fgets(buf,sizeof(buf)- 1 ,f);
  (buf[ 0 ]=='.' && buf[ 1 ]=='/')
  ?
  (printf("%s/%s\n",getwd(wd),buf+ 2 )) 
  :
  (printf("%s\n",buf));
 } else perror(buf);
}

P.S. Раньше я был Somebody2 ;-)
...
Рейтинг: 0 / 0
А где файло то...
    #32949917
FishingIsGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, в принципе это не так просто делается. Если из скрипта, то можно попробывать такую комбинацию:
1) 'which $0', если там нет, то:
2) pwd + dirname $0
Если есть желание разобраться с линками, то readlink.

Из программы, думаю можно сделать похожую процедуру, но лучше поискать готовые функции. Например в библиотеке popt была похожая функция, наверняка есть и другие.
...
Рейтинг: 0 / 0
А где файло то...
    #32949927
Somebody2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FishingIsGoodДа, в принципе это не так просто делается.


Вопрос был как получить свой полный путь из бинарника.
С помощью getpid можно получить pid, в /proc/pid/cmdline прочесть полный путь к запущенному файлу, далее совсем несложной анализ.

Так в чем проблема то?
...
Рейтинг: 0 / 0
А где файло то...
    #32949939
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";


}
}
...
Рейтинг: 0 / 0
А где файло то...
    #32949941
FishingIsGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Somebody2 FishingIsGoodДа, в принципе это не так просто делается.


Вопрос был как получить свой полный путь из бинарника.
С помощью getpid можно получить pid, в /proc/pid/cmdline прочесть полный путь к запущенному файлу, далее совсем несложной анализ.

Так в чем проблема то?

Извеняюсь, я не вам отвечал :-) Ваш способ несомненно сработает... но только под линуксом.
...
Рейтинг: 0 / 0
А где файло то...
    #32949947
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 (уж не о Виндовс это точно) и скорее всего о Линукс (судя по другим постам автора вопроса)
...
Рейтинг: 0 / 0
А где файло то...
    #32949951
miniСЛОН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Somebody2 FishingIsGoodДа, в принципе это не так просто делается.


Вопрос был как получить свой полный путь из бинарника.
С помощью getpid можно получить pid, в /proc/pid/cmdline прочесть полный путь к запущенному файлу, далее совсем несложной анализ.

Так в чем проблема то?
/proc не везде есть
...
Рейтинг: 0 / 0
А где файло то...
    #32949954
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miniСЛОН Somebody2 FishingIsGoodДа, в принципе это не так просто делается.


Вопрос был как получить свой полный путь из бинарника.
С помощью getpid можно получить pid, в /proc/pid/cmdline прочесть полный путь к запущенному файлу, далее совсем несложной анализ.

Так в чем проблема то?
/proc не везде есть

У автора вопроса, я уверен, есть Так в чем проблема?
...
Рейтинг: 0 / 0
А где файло то...
    #32949955
FishingIsGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot v6y2FishingIsGood
Ну из вопроса собственно следовало, что речь идет именно о Unix (уж не о Виндовс это точно) и скорее всего о Линукс (судя по другим постам автора вопроса)[/quot]

Да я ж и сказал, что на линуксе работать будет, и ничего против такого подхода не имею. Просто я лично стараюсь писать так, что бы при возможности оно работало и на других UNIX'ах. Ведь на то нам грешным и дан POSIX.
...
Рейтинг: 0 / 0
А где файло то...
    #32950007
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v6y miniСЛОН
/proc не везде есть

У автора вопроса, я уверен, есть Так в чем проблема?
На основании чего делаются такие выводы?
В той же солярке -- вы поручитесь?
...
Рейтинг: 0 / 0
А где файло то...
    #32950021
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DocAl v6y miniСЛОН
/proc не везде есть

У автора вопроса, я уверен, есть Так в чем проблема?
На основании чего делаются такие выводы?
В той же солярке -- вы поручитесь?
На основании предыдущих постов, отсутствии ссылки на конкретную ОС в вопросе и наконец на основании названия данного форума, я сделал вывод что у автора Линукс Переменные окружения здесь использовать неправильно (ибо они могут быть изменены порождающим процессом), IMHO, argv[0] тоже вещь не надежная, Cканировать текущую директорию? А где гарантия, что в текущей директории нет другого файла с таким же именем? Тоже отпадает. Что остается? Использовать особенности конкретной ОС (ОС здесь - это Операционная Система, а не большой желтый мух ), а в случае кроссплатформенности условную компиляцию. Все вышесказанное IMHO.

P.S. А я то думал я один такой странный, кому сегодня не бухается
...
Рейтинг: 0 / 0
А где файло то...
    #32950199
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем - бум проверять. Что касаемо OS меня интересует тольки линух (шапка производственая и федорино горе) и солярка (начиная с 8-й). С виндовозом проще, но мне туда не надо... =)

Отставному Somebody2 персональное спасибо за коде.

А в целом задачка така. Есть некий набор программ (tool kit) который чой-то делает. До этого просто в /etc кидался некий conf, который любая апликуха читала и знала, где какие файлы расположены (другие настройки взять, или какой еще ехещник дернуть). Но вот пришло новое требование - чтоб могли работать 2 и более сих kitов на одном боксе. Ну прям как оракл =). Есть конечно путь завести некий MYKIT_HOME и настроить соответсвенно апача. Но не красива будет, с учетом, что клиент туп (да еще и прав всегда) потом не разгребешь, что где он не так настроил.

Ну что посмотрим, как работает сие...
...
Рейтинг: 0 / 0
А где файло то...
    #32950224
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, проверил. Не работат. Ну не совсем, конечно.
1) Если линк - дается путь к линку (и имя линка)
2) Если я запускаю (линк или сам файл - все равно) из под какой-нибудь относительной под-директории (тоесть в пути есть "..") показывается относительный путь, а не от рута.
Так, что пока не годится, однако...

Все равно всем спасибо.
...
Рейтинг: 0 / 0
А где файло то...
    #32950229
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще один момент - на солярке (8-й) доступ к /proc только у рута. Что ставит крест на сем пути окончательный...
...
Рейтинг: 0 / 0
А где файло то...
    #32950254
FishingIsGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну ладно - раз уж помучился уже, то можно рассказать, как это делается на самом деле :-) Есть такая функция realpath.

Код: plaintext
1.
char* real_path[PATH_MAX];
real_path = realpath(argv[ 0 ], real_path);

Она делает примерно то, что я описал в алгоритме: сперва проверяет PATH, а потом разбирает имя файла. Линки она тоже резолвит. Так, что она выдаёт именно то что тебе надо.

PS. Извеняюсь, вчера эта функция у меня что то из головы вылетела :-)
...
Рейтинг: 0 / 0
А где файло то...
    #32950300
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот спасибочки - то, что надо !
Пока, правда на линухе проверил пока, но думаю, на солярке попрет. И линки разобрал, однако...
...
Рейтинг: 0 / 0
А где файло то...
    #32950304
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, ошибочка небольша (наверно, чтоб совсем чайники не сперли =)
Надоть
Код: plaintext
1.
2.
char real_path[PATH_MAX];  // exclude '*' sign!
char* ret = realpath(argv[ 0 ], real_path); // no assigment to real_path

Правда сие g++ 3.4.2 выловил, может на ранних и проскакивало... хотя, не думаю. Еще замечание про солярку - тама в /proc все pidы c d--x--x--x стоят. Так, что тетеретически можно им chmod сделать (создаются они от того юзверя, что процесс пусканул, так что не проблема) и дальше посмотреть. Но щас сие уже не актуально...
...
Рейтинг: 0 / 0
А где файло то...
    #32950334
FishingIsGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrushokДа, ошибочка небольша (наверно, чтоб совсем чайники не сперли =)

Да разумеется. Первая строчка имелась в виду: char* real_path = new char[PATH_MAX] Кстати функция меняет второй параметр (если не ошибаюсь), поэтому нет необходимости приравнивать к чему нибудь. На других UNIX'ах она тоже должна работать, потому как - это часть "Single UNIX specification".
...
Рейтинг: 0 / 0
А где файло то...
    #32950386
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет 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.
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv) {
 pid_t pid=getpid();
 char linkpath[ 256 ];
 char path[ 256 ];
 snprintf(linkpath,sizeof(linkpath)- 1 ,"/proc/%u/exe",pid);
 if  (realpath(linkpath,path, sizeof(path)- 1 )) puts(path);
 else perror(linkpath);
}
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / А где файло то...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]