web-dev-qa-db-fra.com

Comment obtenir le nom du processus actuel sur Linux?

Comment puis-je obtenir le nom du processus en C? Le même nom, qui est dans /proc/$pid/status. Je ne veux pas analyser ce fichier. Y a-t-il un moyen programmatique de faire cela?

20
Mariusz

Ceci est indiqué par le argv[0] ou bien vous pouvez lire /proc/self/status. Ou vous pouvez utiliser getenv("_"), ne sachant pas qui le définit ni s'il est fiable.

24

Si vous utilisez une glibc, alors:

#define _GNU_SOURCE
#include <errno.h>

extern char *program_invocation_name;
extern char *program_invocation_short_name;

Voir nom_invocation_programme (3)

__progname est également défini par la bibliothèque libc . La seule méthode portable consiste à utiliser argv[0]

33
Pierre Habouzit

Vous pouvez utiliser __progname. Cependant, ce n'est pas mieux que argv[0] car il peut avoir des problèmes de portabilité. Mais comme vous n'avez pas accès à argv[0], cela peut fonctionner comme suit: -

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

Regardez la valeur de argv[0] qui a été transmise à main. Cela devrait être le nom sous lequel votre processus a été appelé.

5
Borealid

Je me sers souvent de l'appel suivant,

char* currentprocname = getprogname();
5
RLT

Si vous ne pouvez pas accéder à argv [] dans main (), car vous implémentez une bibliothèque, vous pouvez consulter ma réponse à une question similaire ici .

Cela revient essentiellement à vous donner accès à argc, argv [] et envp [] en dehors de main () . Vous pourriez alors, comme d'autres l'ont déjà correctement suggéré, utiliser argv [0] pour récupérer le nom du processus.

1
SIGSEGV

Ceci est une version qui fonctionne sur macOS, FreeBSD et 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
0
Ales Teska