簡體   English   中英

如何在linux中獲取當前進程名稱?

[英]How to get current process name in linux?

如何在 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)

在大多數__progname下, __progname也由 libc 定義。 唯一的便攜方式是使用argv[0]

它要么由argv[0]指向,要么確實可以讀取/proc/self/status 或者您可以使用getenv("_") ,不確定是誰設置的以及它的可靠性。

您可以使用__progname 但是它並不比argv[0]因為它可能存在可移植性問題。 但由於您無權訪問argv[0]它可以按如下方式工作:-

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

我經常使用以下電話,

char* currentprocname = getprogname();

查看傳遞給mainargv[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

如果您無法在 main() 中訪問 argv[],因為您正在實現一個庫,您可以在此處查看我對類似問題的回答。

它基本上歸結為讓您可以訪問 main() 之外的 argc、argv[] 和 envp[]。 然后,正如其他人已經正確建議的那樣,您可以使用 argv[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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM