如何在linux中获取当前进程名称?

时间:2012-02-01 14:11:11

标签: c linux

如何在C中获取进程名称?同名,位于/proc/$pid/status。我不想解析该文件。是否有任何编程方式可以做到这一点?

8 个答案:

答案 0 :(得分:34)

如果你正在使用glibc,那么:

#define _GNU_SOURCE
#include <errno.h>

extern char *program_invocation_name;
extern char *program_invocation_short_name;

请参阅program_invocation_name(3)

在大多数Unices下,__progname也由libc定义。 唯一可移植的方法是使用argv[0]

答案 1 :(得分:24)

argv[0]要么指出,要么你可以阅读/proc/self/status。或者你可以使用getenv("_"),不确定是谁设置了它以及它有多可靠。

答案 2 :(得分:14)

您可以使用__progname。但它并不比argv[0]好,因为它可能有可移植性问题。但由于您无法访问argv[0],因此可以按以下方式操作: -

extern char *__progname;
printf("\n%s", __progname);

答案 3 :(得分:5)

查看传递给argv[0]的{​​{1}}的值。这应该是调用进程的名称。

答案 4 :(得分:5)

我经常使用以下电话,

char* currentprocname = getprogname();

答案 5 :(得分:1)

如果你无法访问main()中的argv [],因为你正在实现一个库,你可以看看我对类似问题here的回答。

它基本上归结为允许您访问main()之外的argc,argv []和envp []。 然后你可以像其他人已经正确建议的那样,使用argv [0]来检索进程名称。

答案 6 :(得分:0)

这是一个适用于macOS,FreeBSD和Linux的版本。

#if defined(__APPLE__) || defined(__FreeBSD__)
const char * appname = getprogname();
#elif defined(_GNU_SOURCE)
const char * appname = program_invocation_name;
#else
const char * appname = "?";
#endif

答案 7 :(得分:0)

为了后代,一个更像 C++ 的版本并且也适用于 MSVC:

https://godbolt.org/z/sh3TnM

#define FMT_HEADER_ONLY
#include <fmt/format.h>

std::string get_current_process_name()
{
    #if defined(__APPLE__) || defined(__FreeBSD__)
        return getprogname();
    #elif defined(_GNU_SOURCE)
        return program_invocation_name;
    #elif defined(_WIN32)
        return __argv[0];
    #else
        return "?";
    #endif
}

int main()
{
    fmt::print("whatsmyname: {}\n", get_current_process_name());
    return 0;
}

// msvc output:
// whatsmyname: C:\Users\<user>\source\repos\Project6\Debug\Project6.exe