La manipulation du nom dans la liste des processus est une pratique courante. Par exemple. J'ai dans mon processus la liste suivante :
root 9847 0.0 0.0 42216 1560 ? Ss Aug13 8:27 /usr/sbin/dovecot -c /etc/dovecot/d
root 20186 0.0 0.0 78880 2672 ? S Aug13 2:44 \_ dovecot-auth
dovecot 13371 0.0 0.0 39440 2208 ? S Oct09 0:00 \_ pop3-login
dovecot 9698 0.0 0.0 39452 2640 ? S Nov07 0:00 \_ imap-login
ericb 9026 0.0 0.0 48196 7496 ? S Nov11 0:00 \_ imap [ericb 192.168.170.186]
Dovecot utilise ce mécanisme pour montrer facilement ce que fait chaque processus.
C'est fondamentalement aussi simple que de manipuler le argv[0]
paramètre en C. argv
est un tableau de pointeurs vers les paramètres avec lesquels le processus a été lancé. Donc une commande ls -l /some/directory
aura :
argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null
En allouant de la mémoire, en mettant du texte dans cette mémoire, puis en mettant l'adresse de cette mémoire dans argv[0]
le nom du processus affiché aura été modifié avec le nouveau texte.
Changer argv[] n'est pas portable. Sous Linux, vous ne pouvez pas non plus simplement modifier argv[0] pour pointer vers une chaîne plus longue. Vous devrez écraser les arguments existants et veiller à ne pas écraser les variables d'environnement qui suivent dans l'espace d'adressage.
libbsd fournit une implémentation de setproctitle(3) pour Linux qui rend cela beaucoup plus facile.
Il existe deux manières standard Linux de le faire, dont l'une provient de la glibc et peut être portable sur d'autres systèmes non Linux :
- glibc
pthread_setname_np()
est probablement la meilleure méthode - Linux
prctl()
fonctionne aussi
Il est possible que la modification de argv[0]
fonctionnait auparavant, mais au moins sur mon système Linux actuel, cela ne fait rien à la sortie en ps
.
Voir cette réponse pour plus de détails et un exemple de code :https://stackoverflow.com/a/55584492/737303