La manipolazione del nome nell'elenco dei processi è una pratica comune. Per esempio. Nel mio processo ho elencato quanto segue:
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 utilizza questo meccanismo per mostrare facilmente cosa sta facendo ogni processo.
Fondamentalmente è semplice come manipolare il argv[0]
parametro in C. argv
è un array di puntatori ai parametri con cui il processo è stato avviato. Quindi un comando ls -l /some/directory
avrà:
argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null
Allocando un po' di memoria, mettendo del testo in quella memoria, e poi mettendo l'indirizzo di quella memoria in argv[0]
il nome del processo mostrato sarà stato modificato con il nuovo testo.
La modifica di argv[] non è portabile. Su Linux non puoi semplicemente cambiare argv[0] in modo che punti a una stringa più lunga. Dovresti sovrascrivere gli argomenti esistenti e fare attenzione a non sovrascrivere le variabili di ambiente che seguono nello spazio degli indirizzi.
libbsd fornisce un'implementazione di setproctitle(3) per Linux che lo rende molto più semplice.
Esistono due modi standard di Linux per farlo, uno dei quali proviene da glibc e potrebbe essere portabile su altri sistemi non Linux:
- glibc
pthread_setname_np()
è probabilmente il metodo migliore - Linux
prctl()
funziona anche
È possibile che la modifica di argv[0]
funzionava, ma almeno sul mio attuale sistema Linux non fa nulla all'output in ps
.
Vedi questa risposta per maggiori dettagli e un esempio di codice:https://stackoverflow.com/a/55584492/737303