it-swarm.com.de

Wie bekomme ich den aktuellen Prozessnamen in Linux?

Wie kann ich den Prozessnamen in C erhalten? Derselbe Name, der sich in /proc/$pid/status befindet. Ich möchte diese Datei nicht analysieren. Gibt es einen programmatischen Weg, dies zu tun?

20
Mariusz

Es wird entweder durch den argv[0] gezeigt oder Sie können /proc/self/status tatsächlich lesen. Oder Sie können getenv("_") verwenden, nicht sicher, wer das einstellt und wie zuverlässig es ist.

Wenn Sie eine Glibc verwenden, dann:

#define _GNU_SOURCE
#include <errno.h>

extern char *program_invocation_name;
extern char *program_invocation_short_name;

Siehe program_invocation_name (3)

Bei den meisten Unices wird __progname auch von libc ..__ definiert. Die einzige tragbare Methode ist die Verwendung von argv[0].

33
Pierre Habouzit

Sie können __progname verwenden. Es ist jedoch nicht besser als argv[0], da Portabilitätsprobleme auftreten können. Da Sie jedoch keinen Zugriff auf argv[0] haben, kann dies wie folgt funktionieren:

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

Schauen Sie sich den Wert von argv[0] an, der an main übergeben wurde. Dies sollte der Name sein, unter dem Ihr Prozess aufgerufen wurde.

5
Borealid

Ich mache oft folgenden Anruf,

char* currentprocname = getprogname();
5
RLT

Wenn Sie nicht auf argv [] in main () zugreifen können, weil Sie eine Bibliothek implementieren, können Sie meine Antwort auf eine ähnliche Frage hier - werfen.

Im Grunde läuft es darauf hinaus, Ihnen Zugriff auf argc, argv [] und envp [] außerhalb von main () zu geben ..__ Dann können Sie, wie andere bereits richtig vorgeschlagen haben, argv [0] verwenden, um den Prozessnamen abzurufen.

1
SIGSEGV

Dies ist eine Version, die unter Mac OS, FreeBSD und Linux funktioniert.

#if defined(__Apple__) || defined(__FreeBSD__)
const char * appname = getprogname();
#Elif defined(_GNU_SOURCE)
const char * appname = program_invocation_name;
#else
const char * appname = "?";
#endif
0
Ales Teska