代码之家  ›  专栏  ›  技术社区  ›  BЈовић

如果无法访问argv[0],如何获取程序名?

  •  10
  • BЈовић  · 技术社区  · 14 年前

    我知道程序名作为第一个参数传递,下一个简单示例将把它打印到标准输出:

    #include <iostream>
    int main ( int argc, char *argv[] )
    {
      std::cout<<argv[0]<<std::endl;
    }
    

    是否有获取程序名称的函数?

    编辑

    我从shell启动程序,上面的代码将始终打印程序名(我使用的是Fedora9,但我确信它在其他发行版中也能正常工作)。

    我发现/proc/self/directory可能包含我要查找的内容,但在该目录中找不到确切内容。

    6 回复  |  直到 8 年前
        1
  •  19
  •   Fred Foo    14 年前

    __progname err(3)

    readlink /proc/self/exe

    char *program_path()
    {
        char *path = malloc(PATH_MAX);
        if (path != NULL) {
            if (readlink("/proc/self/exe", path, PATH_MAX) == -1) {
                free(path);
                path = NULL;
            }
        }
        return path;
    }
    

    argv[0]

        2
  •  9
  •   ereOn    14 年前

    argv[0] execve

        3
  •  6
  •   paxdiablo    14 年前

    exec

    argv[0]


    proc /proc/self/exe

    procfs

        4
  •  4
  •   Sauron    8 年前

    #include <errno.h>
    ...
    fprintf(stderr, "Program name is %s\n", program_invocation_name);
    

    man invocation_name

    program_invocation_name argv[0] main()

    program_invocation_short_name

        5
  •  3
  •   Eugene Smith    14 年前

        6
  •  2
  •   Steve-o    14 年前

    g_get_prgname() . 在Win32上,它调用 GetModuleFileNameW() ,但对于其他所有内容,它似乎都返回空值。