从程序中查找执行文件的名称

时间:2015-02-08 13:51:13

标签: c

我正在寻找一种方法来查找运行它的可执行文件的名称。这意味着,如果我有一个名为program的文件,它运行的东西我想得到它的名字。

使用__FILE__并不适合我,因为我需要可执行文件名而不是包含代码的C文件名。

我想知道是否有一个可以帮助我的gcc宏或我找不到的内置函数。

编辑: 另外使用argv[0]是不合适的,因为我不仅需要在main中调用该函数。

将argv [0]参数传递给可能需要此参数的所有函数也是不可接受的,因为它将在整个系统中使用(我需要通过它进行哈希)。

5 个答案:

答案 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];

  ...

}