source

리눅스에서 현재 프로세스 이름을 가져오는 방법?

nicesource 2023. 10. 1. 19:31
반응형

리눅스에서 현재 프로세스 이름을 가져오는 방법?

C에서 공정명을 어떻게 받을 수 있습니까?안에 있는 동명이인./proc/$pid/status. 저는 그 파일을 파싱하고 싶지 않습니다.이것을 할 수 있는 체계적인 방법이 있습니까?

glibc를 사용하는 경우 다음을 수행합니다.

#define _GNU_SOURCE
#include <errno.h>

extern char *program_invocation_name;
extern char *program_invocation_short_name;

program_invocationion_name(3) 참조

대부분의 유니세프 아래에서__prognamelibc에서도 정의합니다.휴대할 수 있는 유일한 방법은argv[0]

그들이 지목한 것은argv[0]아니면 정말로 당신은 읽을 수 있습니다./proc/self/status. 아니면 사용해도 좋습니다.getenv("_"), 누가 설정하고 얼마나 신뢰할 수 있는지 확신할 수 없습니다.

사용가능__progname. 그러나 그것은 더 좋지 않습니다.argv[0]휴대성에 문제가 있을 수 있기 때문입니다.하지만 당신이 접근할 수 없기 때문에argv[0]다음과 같이 작동할 수 있습니다:-

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

저는 종종 팔로우 콜을 이용합니다.

char* currentprocname = getprogname();

의 가치를 보시오.argv[0]에 전해진.main. 프로세스가 호출된 이름이어야 합니다.

이것은 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++-ish한 버전으로 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

언급URL : https://stackoverflow.com/questions/9097201/how-to-get-current-process-name-in-linux

반응형