2015-02-08 4 views
0

Я ищу способ найти имя исполняемого файла, который его запускает. что если у меня есть файл с именем program, который запускает что-то, я хотел бы получить его имя.найти имя исполняемого файла с помощью программы

Использование __FILE__ не подходит мне, поскольку мне нужно имя исполняемого файла, а не имя файла C, содержащее код.

Мне интересно, есть ли макрос gcc, который может помочь мне или встроенную функцию, которую я не смог найти.

EDIT: Также использование argv[0] не подходит, поскольку мне нужно вызвать функцию не только внутри основного.

И передать параметр argv [0] ко всем функциям, которые могут потребоваться для этого параметра, также не является приемлемым, поскольку он будет использоваться во всей системе (мне нужно хешировать им).

+0

@zenith Thnx. Я просто добавлял его в качестве комментария, указав, что он не отвечает моим потребностям. –

+0

Вам это нужно для работы в Windows или достаточно POSIX-систем? – Wintermute

+0

Я запускаю его на linux –

ответ

2

Стандартное определение для main() в С:

int main(int argc, char **argv) 

argv[0] содержит имя программы, как выполняется.

+0

Привет и спасибо, извините, но использование argv [0] не соответствует моим потребностям, я просто добавлял его с редактированием, когда вы отвечали. –

+0

OP упомянул против 'argv [0]'. – shauryachats

+0

Это действительно странное требование. Этот код гольф? –

3
int main(int argc,char* argv[]) 
{ 
    printf("%s",argv[0]); 
    return 0; 
} 

Первый аргумент (argv[0]) содержит имя программы, находящуюся перспективу.

+1

Привет, спасибо, извините, но использование argv [0] не соответствует моим потребностям, я просто добавлял его с редактированием, когда вы отвечали. –

+1

@ Anton.P копировать 'argv [0]' содержимое и использовать его как пожелаете? –

+1

@ Anton.P Пожалуйста, отметьте его как отредактировать с помощью 'argv [0]', иначе люди, которые приходят сюда, подумают, что Cool Guy просто полностью не понял вопрос – Rizier123

2

От main, перейдите argv[0] туда, где вам может понадобиться название программы.

Или, если для этого требуется множество функций, и вы хотите избежать слишком многого, назначьте его глобальной переменной.

Вы запросили макросы в качестве решения, но они были расширены во время компиляции. И поскольку имя исполняемого файла можно изменить после компиляции, то, что вы хотите, не может быть определено во время компиляции, поэтому макросы не могут быть и речи.

+0

Там программа довольно большая и содержит десятки таких модулей, функция, которую я добавляю, является небольшой, и я не хочу вносить изменения во все модули, чтобы добавить крошечную функцию. –

+0

Хм, хорошо, тогда это сложно ... – emlai

+1

@ Anton.P Единственное решение, которое я вижу, это добавить две строки для определения глобальной переменной и в 'main' присваивать' argv [0] 'этому. Будет ли две небольшие строки слишком большой модификацией? – emlai

1

Часто помните, что argv[0] от main вполне достаточно.

Если это не так - например, если вы являетесь разделяемой библиотекой, или если вы беспокоитесь о том, что ваш вызывающий абонент начал вас с поддельным argv[0] (это возможно, но необычно), вы можете на POSIX-совместимом системы с смонтированной /proc, используйте readlink разрешить /proc/self/exe и получить путь к основной бинарный файл запущенного процесса:

#include <limits.h> 
#include <unistd.h> 

// Note that readlink does not null-terminate the result itself. This 
// is important if the link target contains null bytes itself, I suppose, 
// but it means that you have to take care that the null-terminator is 
// placed yourself if you're going to use the file name as a string. 
char buf[PATH_MAX] = { 0 }; 
readlink("/proc/self/exe", buf, PATH_MAX); 

а на Windows, есть GetModuleFileName функция:

#include <windows.h> 

TCHAR buf[MAX_PATH]; 
GetModuleFileName(NULL, buf, MAX_PATH); 
0

Имя запуска дается через main()argv[0] и может считаться постоянным.

Так почему бы не сделать это доступным через программу, используя глобальную ссылку на нее.

progname.h

#ifndef PROGNAME_H 
#define PROGNAME_H 

extern char * progname; 

#endif 

основной.с

#include "progname.h" 

char * progname = NULL; 

int main(int argc, char ** argv) 
{ 
    progname = argv[0]; 

    ... 

} 

Доступ его из любой точки, как так

module1.c

#include <stdio.h> 
#include "progname.h" 

void f(void) 
{ 
    printf("progname='%s'\n", progname ?progname :"<not set>"); 
} 
Смежные вопросы