プロセス リスト内の名前を操作することは、一般的な方法です。例えば。私は次のリストを作成中です:
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 はこのメカニズムを使用して、各プロセスが何をしているかを簡単に表示します。
基本的に argv[0]
を操作するのと同じくらい簡単です C のパラメータ。 argv
プロセスが開始されたパラメーターへのポインターの配列です。コマンド ls -l /some/directory
argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null
いくつかのメモリを割り当て、そのメモリにテキストを入れ、そのメモリのアドレスを argv[0]
に入れます。 表示されるプロセス名は新しいテキストに変更されます。
argv[] の変更は移植性がありません。 Linux では、単純に argv[0] をより長い文字列を指すように変更することもできません。既存の引数を上書きし、アドレス空間に続く環境変数を上書きしないように注意する必要があります.
libbsd は、これをより簡単にする Linux 用の setproctitle(3) の実装を提供します。
これを行う Linux 標準の方法が 2 つあります。そのうちの 1 つは glibc から来ており、他の非 Linux システムに移植できる可能性があります。
- glibc
pthread_setname_np()
おそらくより良い方法です - Linux
prctl()
も機能します
argv[0]
を変更する可能性があります 以前は機能していましたが、少なくとも現在の Linux システムでは ps
の出力には何もしません。 .
詳細とコード例については、この回答を参照してください:https://stackoverflow.com/a/55584492/737303