Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Как узнать полный путь к своей программе


Автор: Finn 30.6.2007, 10:49
Подскажите, как узнать полный путь к программе из самой программы, если я зупускаю её из другого места?
Например, чтоб функция вернула мне /usr/bin.

Автор: Kuvaldis 30.6.2007, 12:02
первый аргумент командной строки отвечает за полный путь
Это значит, что если main() объявлена так:
int main(int argc, char* argv[])
то путь - это строка argv[0] 

Автор: nickless 30.6.2007, 12:14
Цитата(Kuvaldis @  30.6.2007,  11:02 Найти цитируемый пост)
первый аргумент командной строки отвечает за полный путь

В нём тот путь, с которым запустили программу, если запустить программу /usr/bin/prog например так:
Код

cd /usr/bin
../bin/prog

То в argv[0] будет ../bin/prog, а не /usr/bin/prog
Нужно проверять, полный ли путь и если нет, добавлять рабочую папку, (man getcwd)

Автор: MAKCim 30.6.2007, 12:17
Kuvaldis
немного не то
ему нужен полный путь
а если брать только argv[0], то он может быть относительным

Добавлено через 13 минут и 25 секунд
Код

char array[256];
strcat(strcat(strcat(array, get_current_dir_name()), "/"), basename(*argv));

Автор: Finn 30.6.2007, 13:53
Спасибо.

Автор: null56 15.5.2008, 00:33
Так не ВСЕГДА сработает, потому что get_current_dir_name возвращает текущий рабочий каталог, но это не значит, что пользователь запускает его именно из того, где находится исполняемый файл
Код

char array[256];
strcat(strcat(strcat(array, get_current_dir_name()), "/"), basename(*argv));


Например:
Запускаем: ./my_file 
Здесь все норм: чтобы не стояло слева в пути, все будет выведено + / basename

Но:
Запускаем: 
cd /root
/root/1/2/3/4/my_file

На выходе получим: /root + / + basename

Чтобы всегда получать полный путь (это даже написано в описании этих функций)
Код

Concatenating the string returned by dirname(), a "/", and the string returned by basename() yields a complete path-
name.


То есть: dirname(argv[0]) + "/" + basename(argv[0]) - всегда будем получать правильный ответ...
Насколько показали тесты...

Автор: xvr 15.5.2008, 11:58
Имя исполняемого файла (Linux):
Код

 char exe_name[10240];
 int l=readlink("/proc/self/exe",exe_name,sizeof(exe_name));
 exe_name[l]=0;

Автор: MAKCim 15.5.2008, 13:34
null56
xvr
некрофилы  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)