如何在C中获取进程名称?同名,位于/proc/$pid/status
。我不想解析该文件。是否有任何编程方式可以做到这一点?
答案 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:
#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