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

C 如何在linux中获取当前进程名?,c,linux,C,Linux,如何在C中获取进程名称?相同的名称,位于/proc/$pid/status中。我不想解析那个文件。是否有任何编程方法可以执行此操作?查看传递给main的argv[0]的值。这应该是调用进程的名称。它由argv[0]指向,或者您确实可以读取/proc/self/status。或者您可以使用getenv(“\u”),但不确定是谁设置的以及它的可靠性。您可以使用\uu progname。但是,它并不比argv[0]好,因为它可能存在可移植性问题。但是,由于您无权访问argv[0]它可以按如下方式工作:

如何在C中获取进程名称?相同的名称,位于
/proc/$pid/status
中。我不想解析那个文件。是否有任何编程方法可以执行此操作?

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

它由
argv[0]
指向,或者您确实可以读取
/proc/self/status
。或者您可以使用
getenv(“\u”)
,但不确定是谁设置的以及它的可靠性。

您可以使用
\uu progname
。但是,它并不比argv[0]好,因为它可能存在可移植性问题。但是,由于您无权访问
argv[0]
它可以按如下方式工作:-

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

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

#define _GNU_SOURCE
#include <errno.h>

extern char *program_invocation_name;
extern char *program_invocation_short_name;
定义GNU源
#包括
外部字符*程序调用名称;
extern char*程序调用名称;
参见程序调用名称(3)

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

我经常使用下面的调用

char* currentprocname = getprogname();

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

它基本上归结为允许您在main()之外访问argc、argv[]和envp[]。
然后,正如其他人已经正确建议的那样,您可以使用argv[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

对于后人来说,一个更像C++-ish的版本也适用于MSVC:

#仅定义FMT#U头
#包括
std::string get_current_process_name()
{
#如果已定义(uu苹果公司)| |已定义(u FreeBSD)
返回getprogname();
#定义的elif(_GNU_源)
返回程序调用名称;
#elif已定义(_WIN32)
返回argv[0];
#否则
返回“?”;
#恩迪夫
}
int main()
{
fmt::print(“whatsmyname:{}\n”,获取当前进程名称();
返回0;
}
//msvc输出:
//whatsmyname:C:\Users\\source\repos\Project6\Debug\Project6.exe

不幸的是,在这种情况下,我没有访问argv[0]@Mariusz的权限,那么你必须通过proc-尽管我建议
/proc/self/cmdline
@Mariusz,但你也可以尝试
getenv(“”)
,尽管我不确定它有多可靠。这是BSD特有的。您可以使用
libbsd
在Linux上获得它,但它不是libc的一部分,因为它在FreeBSD或OS X上。请注意,
getenv(“”)
似乎返回最初由shell启动的进程——如果我在
make
启动的进程中调用它,我看到的是“/usr/bin/make”,而不是进程名。这意味着它可能是由shell设置的。或者您可以查看/proc/self/cmdline
#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