Memanipulasi nama dalam daftar proses adalah praktik umum. Misalnya. Saya memiliki daftar berikut dalam proses saya:
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 menggunakan mekanisme ini untuk menunjukkan dengan mudah apa yang dilakukan setiap proses.
Ini pada dasarnya sesederhana memanipulasi argv[0]
parameter dalam C. argv
adalah larik penunjuk ke parameter yang dengannya proses telah dimulai. Jadi perintah ls -l /some/directory
akan memiliki:
argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null
Dengan mengalokasikan sebagian memori, memasukkan beberapa teks ke dalam memori itu, lalu memasukkan alamat memori itu ke dalam argv[0]
nama proses yang ditampilkan akan dimodifikasi menjadi teks baru.
Mengubah argv[] tidak portabel. Di Linux Anda tidak bisa begitu saja mengubah argv[0] untuk menunjuk ke string yang lebih panjang. Anda harus menimpa argumen yang ada dan berhati-hati agar tidak menimpa variabel lingkungan yang mengikuti di ruang alamat.
libbsd menyediakan implementasi setproctitle(3) untuk Linux yang membuatnya lebih mudah.
Ada dua cara standar Linux untuk melakukannya, salah satunya berasal dari glibc dan mungkin portabel untuk sistem non-Linux lainnya:
- glibc
pthread_setname_np()
mungkin metode yang lebih baik - Linux
prctl()
juga berfungsi
Mungkin saja mengubah argv[0]
dulu berfungsi, tetapi setidaknya pada sistem Linux saya saat ini tidak melakukan apa pun pada keluaran di ps
.
Lihat jawaban ini untuk detail lebih lanjut dan contoh kode:https://stackoverflow.com/a/55584492/737303