如何在C语言中获取进程名称?与/proc/$pid/status
中的相同名称。我不想解析那个文件。是否有任何编程方法可以实现这一点?
如果您是使用glibc,则:
#define _GNU_SOURCE
#include <errno.h>
extern char *program_invocation_name;
extern char *program_invocation_short_name;
请参考 program_invocation_name(3)。
在大多数Unix系统中,libc 也会定义 __progname。 唯一可移植的方法是使用 argv[0]。
它指向argv[0]
,或者你可以读取/proc/self/status
。或者你可以使用getenv("_")
,不确定是谁设置的,以及它的可靠性如何。
你可以使用 __progname
。然而,它可能存在可移植性问题,不如 argv[0]
更好。但是如果你没有访问权限 argv[0]
,那么可以按照以下方式工作:
extern char *__progname;
printf("\n%s", __progname);
char* currentprocname = getprogname();
libbsd
得到它,但它不像在FreeBSD或OS X上一样成为libc的一部分。 - Cairnarvon查看传递给main
的argv [0]
的值。这应该是调用您的进程的名称。
/proc/self/cmdline
。 - Borealidgetenv("_")
,但我不确定它的可靠性。 - Michael Krelin - hacker#if defined(__APPLE__) || defined(__FreeBSD__)
const char * appname = getprogname();
#elif defined(_GNU_SOURCE)
const char * appname = program_invocation_name;
#else
const char * appname = "?";
#endif
#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
getenv("_")
似乎返回由shell最初启动的进程--如果我在由make
启动的进程中调用它,我会看到"/usr/bin/make",而不是我的进程名称。 这意味着它可能是由shell设置的。 - Roger Lipscombe