Manipulace s názvem v seznamu procesů je běžnou praxí. Např. Ve svém procesu uvádím následující:
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 používá tento mechanismus, aby snadno ukázal, co každý proces dělá.
Je to v podstatě stejně jednoduché jako manipulace s argv[0]
parametr v C. argv
je pole ukazatelů na parametry, se kterými byl proces spuštěn. Tedy příkaz ls -l /some/directory
bude mít:
argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null
Alokací nějaké paměti, vložením nějakého textu do této paměti a pak vložením adresy této paměti do argv[0]
zobrazený název procesu bude upraven na nový text.
Změna argv[] není přenosná. V Linuxu také nemůžete jednoduše změnit argv[0] tak, aby ukazoval na delší řetězec. Museli byste přepsat existující argumenty a dávat pozor, abyste nepřepsali proměnné prostředí, které následují v adresovém prostoru.
libbsd poskytuje implementaci setproctitle(3) pro Linux, která to značně usnadňuje.
Existují dva standardní způsoby Linuxu, jak toho dosáhnout, z nichž jeden pochází z glibc a může být přenosný na jiné systémy než Linux:
- glibc
pthread_setname_np()
je pravděpodobně lepší metoda - Linux
prctl()
také funguje
Je možné, že změna argv[0]
dříve fungovalo, ale alespoň na mém současném systému Linux nedělá nic s výstupem v ps
.
Další podrobnosti a příklad kódu naleznete v této odpovědi:https://stackoverflow.com/a/55584492/737303