Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Имя исполняемого файла

3 views
Skip to first unread message

Antony Pavlenko

unread,
Sep 20, 2004, 1:26:06 PM9/20/04
to
Здраствуйте.
Ни кто не подскажет есть ли в Linux'e функция, с помощью которой можно узнать
имя файла, который запущен (argv[0]). Но не через /proc/self/exe, а что-то на
подобии Солярковской getexecname?

Всего

Unrau Alexander

unread,
Sep 21, 2004, 3:08:43 AM9/21/04
to

> Здраствуйте.
> Hи кто не подскажет есть ли в Linux'e функция, с помощью которой можно
> узнать
> имя файла, который запущен (argv[0]). Hо не через /proc/self/exe, а
> что-то на
> подобии Солярковской getexecname?
> Всего

Я я видел пару реализаций с некоторой эвристикой, и сам писал обобщённо
следующее.
Типа:
1. Если в argv[0] первый символ `/` - то путь абсолютный.
2. Если в argv[0] есть символ `/` то путь относительный и надо его
отсчитывать
от текущего. Hо тут есть подвох если после запуска программы изменялся
текущий
путь.
3. Если ни п.1. ни п.2. то ищем файл по переменной окружения PATH. Тут
тоже есть
тонкости:
1. Пустая подстрока многими расцениваеся как текущий путь (ну или её
можно на
'.' заменять)
Т.е. PATH=:/bin/:/usr/bin/ - ищем в '.' '/bin/' '/usr/bin/'
PATH=/bin/::/usr/bin/ - ищем в '/bin/' '.' '/usr/bin/'
PATH=/bin/:/usr/bin/: - ищем в '/bin/' '/usr/bin/' '.'
2. Если переменная PATH пустая, или не установлена то применяется
дефолтный путь
PATH=:/bin:/usr/bin

Hу далее ещё упрощают путь убирая последовательности типа dir/../ и
разрезолвливают
симлинки.


--
Unrau Alexander

john gladkih

unread,
Sep 21, 2004, 4:51:12 AM9/21/04
to
"Unrau Alexander" <unrau_f...@papillon.ru> writes:

>> Hи кто не подскажет есть ли в Linux'e функция, с помощью которой можно
>> узнать
>> имя файла, который запущен (argv[0]). Hо не через /proc/self/exe, а
>> что-то на
>> подобии Солярковской getexecname?
>> Всего
>
> Я я видел пару реализаций с некоторой эвристикой, и сам писал обобщённо
> следующее.
> Типа:
> 1. Если в argv[0] первый символ `/` - то путь абсолютный.
> 2. Если в argv[0] есть символ `/` то путь относительный и
> надо его

абсолютно некорретно. в argv[0] по определению мусор.

--
john, http://john.kak-sam.to

Sergey A. Cherukhin

unread,
Sep 21, 2004, 5:04:34 AM9/21/04
to
"Antony Pavlenko" <an...@synartra.com> wrote in message
news:cin3qv$t7u$19...@www.fido-online.com...

basename(argv[0]);

Подойдет?
--
WBW
Sergey A. Cherukhin


andrew baranovich

unread,
Sep 21, 2004, 6:28:01 AM9/21/04
to
On Mon, 20 Sep 2004, Antony Pavlenko wrote:

AP> Здраствуйте.
AP> Ни кто не подскажет есть ли в Linux'e функция, с помощью которой можно узнать
AP> имя файла, который запущен (argv[0]). Но не через /proc/self/exe, а что-то на
AP> подобии Солярковской getexecname?

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

#define TASK_SIZE 0xc0000000
int main(int argc, char **argv)
{
char *myself, path[PATH_MAX];

myself = (char*)(TASK_SIZE - 5);
while (*--myself)
;
printf("%s\n", realpath(++myself, path));

return 0;
}

--
...

Pavel Gulchouck

unread,
Sep 21, 2004, 4:40:24 AM9/21/04
to
Hi Antony!

20 Sep 04, Antony Pavlenko ==> All:

AP> Здраствуйте.
AP> Hи кто не подскажет есть ли в Linux'e функция, с помощью которой можно
AP> узнать имя файла, который запущен (argv[0]). Hо не через
AP> /proc/self/exe, а что-то на подобии Солярковской getexecname?

Можно посмотреть, откуда его берет "ps c".

Lucky carrier,
Паша
aka g...@gul.kiev.ua

Pavel Gulchouck

unread,
Sep 21, 2004, 6:16:54 AM9/21/04
to
Hi andrew!

21 Sep 04, andrew baranovich ==> Antony Pavlenko:

AP>> Здраствуйте.
AP>> Hи кто не подскажет есть ли в Linux'e функция, с помощью которой

AP>> можно узнать имя файла, который запущен (argv[0]). Hо не через


AP>> /proc/self/exe, а что-то на подобии Солярковской getexecname?

ab> #include <stdio.h>
ab> #include <limits.h>
ab> #include <stdlib.h>

ab> #define TASK_SIZE 0xc0000000
ab> int main(int argc, char **argv)
ab> {
ab> char *myself, path[PATH_MAX];

ab> myself = (char*)(TASK_SIZE - 5);
ab> while (*--myself)
ab> ;
ab> printf("%s\n", realpath(++myself, path));

ab> return 0;
ab> }

Что-то не работает. :(
Говорит, "(null)". А ++myself - пустая строка.
Там (перед (char *)0xc0000000) у меня получаются нули сплошные.
2.6.8-1.521.

andrew baranovich

unread,
Sep 21, 2004, 9:21:45 AM9/21/04
to
On Tue, 21 Sep 2004, Pavel Gulchouck wrote:

PG> Что-то не работает. :(
PG> Говорит, "(null)". А ++myself - пустая строка.
PG> Там (перед (char *)0xc0000000) у меня получаются нули сплошные.
PG> 2.6.8-1.521.

Ну, значит, ой. Ж-(

$ uname -sr
Linux 2.4.20-34.7asp

/usr/src/linux-2.4.20-34.7asp/fs/exec.c:

855 retval = prepare_binprm(&bprm);
856 if (retval < 0)
857 goto out;

858 retval = copy_strings_kernel(1, &bprm.filename, &bprm);
859 if (retval < 0)
860 goto out;

--
...

Antony Pavlenko

unread,
Sep 21, 2004, 9:41:09 AM9/21/04
to

Mon Sep 20 2004 21:26, Antony Pavlenko wrote to All:

AP> From: "Antony Pavlenko" <an...@synartra.com>

AP> Здраствуйте.
AP> Hи кто не подскажет есть ли в Linux'e функция, с помощью которой можно
AP> узнать имя файла, который запущен (argv[0]). Hо не через /proc/self/exe,
AP> а что-то на подобии Солярковской getexecname?

AP> Всего
Хм, наверно недоформулировал вопрос.
В динамически подключаемой библиотеке необходимо узнать что за прога ее
подключила...

Всего

Unrau Alexander

unread,
Sep 22, 2004, 2:16:37 AM9/22/04
to
>> Я я видел пару реализаций с некоторой эвристикой, и сам писал обобщённо
>> следующее.
>> Типа:
>> 1. Если в argv[0] первый символ `/` - то путь абсолютный.
>> 2. Если в argv[0] есть символ `/` то путь относительный и
>> надо его
>абсолютно некорретно. в argv[0] по определению мусор.

Согласен, содержимое argv[0] на совести запускающей программы.
Hо как достичь результата не прибегая к /proc* ?


--
Unrau Alexander

Unrau Alexander

unread,
Sep 22, 2004, 2:29:57 AM9/22/04
to

> Хм, наверно недоформулировал вопрос.
> В динамически подключаемой библиотеке необходимо узнать что за прога ее
> подключила...

А от меня попутный вопрос:
Можно ли какнить надыбать argv[]/argc в любом месте программы (например в
той-же библиотеке и т.д.)?

--
Unrau Alexander

Antony Pavlenko

unread,
Sep 22, 2004, 5:45:35 AM9/22/04
to
Wed Sep 22 2004 10:29, Unrau Alexander wrote to All:
UA> А от меня попутный вопрос:
UA> Можно ли какнить надыбать argv[]/argc в любом месте программы (например в
UA> той-же библиотеке и т.д.)?
А самое обидное, что так как мы линкуем библиотеку к файлу, то у этого файла
_точно_ есть весь argv. И доставать его через какие-то системные вызовы уже не
очень правильно :-(

Всего

Romio Pedchenko

unread,
Sep 22, 2004, 1:24:16 PM9/22/04
to
\|/ Hi there, Antony!

21 Sep 04 16:41, Antony Pavlenko wrote to Antony Pavlenko:

AP> В динамически подключаемой библиотеке необходимо узнать что за прога ее
AP> подключила...
А явно передавать в парметр функции этой библиотеки нельзя? =)

wbr, Lucky Romio // ro...@ck.ukrtel.net // [wanna smoke!]

... Ea frumoasa ca o floare, luminoasa ca un soare

0 new messages