我正在寻找一种方法来查找运行它的可执行文件的名称。这意味着,如果我有一个名为program
的文件,它运行的东西我想得到它的名字。
使用__FILE__
并不适合我,因为我需要可执行文件名而不是包含代码的C文件名。
我想知道是否有一个可以帮助我的gcc宏或我找不到的内置函数。
编辑:
另外使用argv[0]
是不合适的,因为我不仅需要在main中调用该函数。
将argv [0]参数传递给可能需要此参数的所有函数也是不可接受的,因为它将在整个系统中使用(我需要通过它进行哈希)。
答案 0 :(得分:3)
int main(int argc,char* argv[])
{
printf("%s",argv[0]);
return 0;
}
第一个参数(argv[0]
)包含正在运行的程序的名称。
答案 1 :(得分:2)
C中main()
的标准定义是:
int main(int argc, char **argv)
argv[0]
包含已执行的程序名称。
答案 2 :(得分:2)
从main
开始,将argv[0]
传递到您可能需要该程序名称的任何位置。
或者如果很多函数需要它并且你想避免过多地传递它,请将它分配给一个全局变量。
您要求将宏作为解决方案,但它们会在编译时进行扩展。由于可编辑后可以更改可执行文件的名称,因此无法在编译时确定所需的内容,因此宏无法使用。
答案 3 :(得分:1)
经常记住来自argv[0]
的{{1}}就足够了。
如果不是这种情况 - 例如,如果您是共享库,或者您担心调用者使用伪造的main
启动了您(这是可能的但不常见),您可以,符合POSIX标准的系统已挂载argv[0]
,使用readlink
解析/proc
并获取正在运行的进程的主二进制文件的路径:
/proc/self/exe
在Windows上,有GetModuleFileName
函数:
#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);
答案 4 :(得分:0)
启动名称是通过main()
的{{1}}提供的,可以认为是不变的。
那么为什么不通过程序使用全局引用来使它可用。
progname.h
argv[0]
的main.c
#ifndef PROGNAME_H
#define PROGNAME_H
extern char * progname;
#endif
从任何类似的地方访问
module1.c
#include "progname.h"
char * progname = NULL;
int main(int argc, char ** argv)
{
progname = argv[0];
...
}