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

30

如何在C语言中获取进程名称?与/proc/$pid/status中的相同名称。我不想解析那个文件。是否有任何编程方法可以实现这一点?

8个回答

45

如果您是使用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]。


30

它指向argv[0],或者你可以读取/proc/self/status。或者你可以使用getenv("_"),不确定是谁设置的,以及它的可靠性如何。


3
请注意,getenv("_")似乎返回由shell最初启动的进程--如果我在由make启动的进程中调用它,我会看到"/usr/bin/make",而不是我的进程名称。 这意味着它可能是由shell设置的。 - Roger Lipscombe
“_” 是由 shell 设置的。 - John Kearney

17

你可以使用 __progname。然而,它可能存在可移植性问题,不如 argv[0] 更好。但是如果你没有访问权限 argv[0],那么可以按照以下方式工作:

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

5
我经常使用以下调用:
char* currentprocname = getprogname();

7
这是BSD特有的。你可以在Linux上使用libbsd得到它,但它不像在FreeBSD或OS X上一样成为libc的一部分。 - Cairnarvon

4

查看传递给mainargv [0]的值。这应该是调用您的进程的名称。


1
很不幸,在这种情况下我无法访问argv[0]。 - Mariusz
2
@Mariusz 那么你将不得不通过 proc 进行操作 - 虽然我建议使用 /proc/self/cmdline - Borealid
@Mariusz,你也可以尝试使用getenv("_"),但我不确定它的可靠性。 - Michael Krelin - hacker

3
这是适用于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

1
为了后人,这是一个更像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

1
如果你无法在main()中访问argv[],因为你正在实现一个库,你可以查看我在类似问题这里上的答案。
基本上归结为让你在main()之外访问argc、argv[]和envp[]。 然后你可以像其他人已经正确建议的那样,使用argv[0]来检索进程名称。

1
或者您可以查看/ proc / self / cmdline - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接