[英]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();
查看傳遞給main
的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
如果您無法在 main() 中訪問 argv[],因為您正在實現一個庫,您可以在此處查看我對類似問題的回答。
它基本上歸結為讓您可以訪問 main() 之外的 argc、argv[] 和 envp[]。 然后,正如其他人已經正確建議的那樣,您可以使用 argv[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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.