[C/C++] Полный путь к программе.

Модератор: Модераторы разделов

Аватара пользователя
DEMON-X
Сообщения: 22
ОС: Gentoo, SUSE 10.3, FreeBSD

[C/C++] Полный путь к программе.

Сообщение DEMON-X »

Нужно получить из программы полный путь к самой себе.

При запуске программ из konqueror получаю путь к домашней папке,
откуда бы ни было запущено приложение.
Некоторые проги как-то находят.


Перепробывал:

argv[0]

getenv( "PWD" );

Код из "Advanced Linux Programming",
по понятным причинам перестаёт работать,
если программа упакована, например, UPX.


Как???
Life Is Short....... Play More.
Now Throwed Windows away. Using Linux fully now. :)
Спасибо сказали:
Аватара пользователя
Paul7
Сообщения: 40

Re: [C/C++] Полный путь к программе.

Сообщение Paul7 »

Смотреть в сторону /proc/self/exe
HP i2000 Dual Itanium / Debian Sarge & Win2k3
Sun Ultra 5 M270 / OpenSolaris Nevada-41
DEC Multia VX42 / OpenBSD 3.8
HP 9000 Model C100 / HP-UX B.11.00
Спасибо сказали:
Аватара пользователя
DEMON-X
Сообщения: 22
ОС: Gentoo, SUSE 10.3, FreeBSD

Re: [C/C++] Полный путь к программе.

Сообщение DEMON-X »

Этот метод как раз и описан в "Advanced Linux Programming",
файл get-exe-path.c

со всеми отсюда вытекающими...
Life Is Short....... Play More.
Now Throwed Windows away. Using Linux fully now. :)
Спасибо сказали:
Аватара пользователя
DaemonTux
Сообщения: 1480
Статус: Юный падаван
ОС: Gentoo

Re: [C/C++] Полный путь к программе.

Сообщение DaemonTux »

А чем тебе argv[0] не устроил?
Vladivostok Linux User Group
Спасибо сказали:
Аватара пользователя
DEMON-X
Сообщения: 22
ОС: Gentoo, SUSE 10.3, FreeBSD

Re: [C/C++] Полный путь к программе.

Сообщение DEMON-X »

Я же сказал, он возвращает путь к домашней папке!!!
Life Is Short....... Play More.
Now Throwed Windows away. Using Linux fully now. :)
Спасибо сказали:
Аватара пользователя
Paul7
Сообщения: 40

Re: [C/C++] Полный путь к программе.

Сообщение Paul7 »

DaemonTux писал(а): ↑
17.01.2007 16:05
А чем тебе argv[0] не устроил?

Потому что это не путь до исполняемого файла, а всего лишь аргумент, что передадим, то и будет:

Код: Выделить всё

itanic% pwd
/tmp/1
itanic% cat 1.c
#include <unistd.h>

int
main()
{
    execl("/tmp/1/2","abcd",0);
}
itanic% cat 2.c
#include <stdio.h>

int
main(int argc,char** argv)
{
    printf("%s\n",argv[0]);
    return 0;
}
itanic% ./2
./2
itanic% ./1
abcd
HP i2000 Dual Itanium / Debian Sarge & Win2k3
Sun Ultra 5 M270 / OpenSolaris Nevada-41
DEC Multia VX42 / OpenBSD 3.8
HP 9000 Model C100 / HP-UX B.11.00
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: [C/C++] Полный путь к программе.

Сообщение Женя Подсыпальников »

А у ядра - нет списка процессов с ихними данными,
для читателей ? :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
DaemonTux
Сообщения: 1480
Статус: Юный падаван
ОС: Gentoo

Re: [C/C++] Полный путь к программе.

Сообщение DaemonTux »

Извиняюсь не так понял вопрос. :unsure:
Vladivostok Linux User Group
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: [C/C++] Полный путь к программе.

Сообщение Zeus »

DEMON-X писал(а): ↑
17.01.2007 16:14
Я же сказал, он возвращает путь к домашней папке!!!

Интересно, что у bash'евских скриптов 0й аргумент возвращает полный путь к реальному файлу который запустили.
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: [C/C++] Полный путь к программе.

Сообщение Женя Подсыпальников »

Т.е. представляет ли ядро UNIX/Linux возможным -
подобные итерации ? :) :

http://msdn2.microsoft.com/en-us/library/ms686701.aspx
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: [C/C++] Полный путь к программе.

Сообщение BlackStar »

А как ты думаешь работают команды ps, top, pmap... ?
LightLang Team
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: [C/C++] Полный путь к программе.

Сообщение Женя Подсыпальников »

Так там, ведь, в структуре о процессе -
полный путь к его файлу покоиться должен ? :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Paul7
Сообщения: 40

Re: [C/C++] Полный путь к программе.

Сообщение Paul7 »

Всякие ps, top итп. работают как раз через /proc.
В шелл-скриптах нулевой аргумент правильный только потому, что его правильно подсовывает шелл.
HP i2000 Dual Itanium / Debian Sarge & Win2k3
Sun Ultra 5 M270 / OpenSolaris Nevada-41
DEC Multia VX42 / OpenBSD 3.8
HP 9000 Model C100 / HP-UX B.11.00
Спасибо сказали:
Аватара пользователя
DEMON-X
Сообщения: 22
ОС: Gentoo, SUSE 10.3, FreeBSD

Re: [C/C++] Полный путь к программе.

Сообщение DEMON-X »

Вроде вещь-то важная.
Сам по себе путь не очень нужен,
просто перестаёт правильно работать что-то вроде:

open ( "./music/123.mp3", O_RDONLY );

Если программа запущена нормально,
в Console или Krusader, ./appname,
то всё в порядке, файл "./music/123.mp3" будет искаться
в каталоге с программой,
а при запуске в Konqueror - будет искаться
в домашнем каталоге.
Это не есть хорошо.
Life Is Short....... Play More.
Now Throwed Windows away. Using Linux fully now. :)
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: [C/C++] Полный путь к программе.

Сообщение Liksys »

А почему нельзя получать $PWD и приклеивать его префиксом к пути к файлу?
/home/ogurec/./music/123.mp3
Это будет работать.
Можешь даже не так получать, а функцией getcwd():
NAME
getcwd - get current working directory
...
long getcwd(char *buf, unsigned long size);
...
CONFORMING TO
The getcwd system call is Linux specific, use the getcwd C library
function for portability.

Но она как видно Линукс-онли
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: [C/C++] Полный путь к программе.

Сообщение elide »

Код: Выделить всё

elide@rebirth| ~/tmp/exec >> cat 1.c
#include <unistd.h>

int main(){
        execl("2", "XXX", 0);
        return 0;
}
elide@rebirth| ~/tmp/exec >> cat 2.c
#include <unistd.h>
#include <linux/limits.h>

int main(int argc, char* argv[]){
        printf("argv: %s\n", argv[0]);

        char path[PATH_MAX];
        int cnt;

        if((cnt=readlink("/proc/self/exe", path, PATH_MAX)) > 0){
                path[cnt] = 0;
                printf("link: %s\n", path);
        }

        return 0;
}
elide@rebirth| ~/tmp/exec >> gcc -o 1 1.c
elide@rebirth| ~/tmp/exec >> gcc -o 2 2.c
elide@rebirth| ~/tmp/exec >> ./1
argv: XXX
link: /home/elide/tmp/exec/2
elide@rebirth| ~/tmp/exec >>
этот ответ дал вам Paul7 в первом же посте. вот расскажите мне, если в первом посте дан ответ, нахрена далее следует 12 постов каких-то непотребных гаданий и рассуждений?
слава роботам!
Спасибо сказали:
Аватара пользователя
DEMON-X
Сообщения: 22
ОС: Gentoo, SUSE 10.3, FreeBSD

Re: [C/C++] Полный путь к программе.

Сообщение DEMON-X »

>
> этот ответ дал вам Paul7 в первом же посте. вот расскажите мне, если в первом посте дан ответ,
> нахрена далее следует 12 постов каких-то непотребных гаданий и рассуждений?
>

Вы читать-то умеете?
Всего-то 12 постов,
еще в первом было написано что подобный код
перестаёт работать после упаковки. ( UPX )

upx ./2

P.S.
Все свои хрены оставьте пожалуйста при себе.
Life Is Short....... Play More.
Now Throwed Windows away. Using Linux fully now. :)
Спасибо сказали:
Аватара пользователя
DEMON-X
Сообщения: 22
ОС: Gentoo, SUSE 10.3, FreeBSD

Re: [C/C++] Полный путь к программе.

Сообщение DEMON-X »

Печально,
можно подвести некоторые итоги.

1. Такая ерунда только в Konqueror.

2. Путь нельзя получить при помощи:
argv[0]
getenv( "PWD" )
getcwd()
get_current_dir_name()
/proc/self/exe

2. Пожалуй стоит переименовать Konqueror в Konquerror ;)

Будем искать...
Life Is Short....... Play More.
Now Throwed Windows away. Using Linux fully now. :)
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: [C/C++] Полный путь к программе.

Сообщение Женя Подсыпальников »

Класс QProcess -
показался мне "высокообещающим"... :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: [C/C++] Полный путь к программе.

Сообщение Женя Подсыпальников »

Ой, его, такой - сначала запустить надо,
шобы оно ответило "откель ?" :)

А потому, Димон,
вот сюда смотри :)

Код: Выделить всё

/*
The tasks are hashed by their pid value and the above hashing function is supposed to distribute the elements uniformly in their domain (0 to PID_MAX-1). The hashtable is used to quickly find a task by given pid, using find_task_pid() inline from [b]include/linux/sched.h[/b]:
--------------------------------------------------------------------------------
*/

static inline struct task_struct *find_task_by_pid(int pid)
{
        struct task_struct *p, **htable = &pidhash[pid_hashfn(pid)];

        for(p = *htable; p && p->pid != pid; p = p->pidhash_next)
               ;

        return p;
}


А потом -
вот эту "struct task_struct" - в памяти -
на твой путь проскань и - найдёшь её нужное поле :)
Пойдём на рыбалку !
Спасибо сказали: