$USERでログインしてtopを実行して自分が所有しているプロセスを表示できる場合は、プロセスの名前を変更できますか?
それでは、どうすればいいですか?そうでない場合、ルートは外部プロセスの名前を変更できますか?それでは、どうすればいいですか?そうでなければなぜですか?
答え1
「名前変更」の意味によって異なります。プロセスにその名前がありません。プロセスにはコマンドラインがあります。プログラムの起動後にコマンドラインを維持する必要はありません。すべてのUnixバリアントはコマンドラインのコピーを保持しますが、切り捨てたり変更することができます(たとえば、引数は中間スペースで実行されるため、foo 'hello world'
区別できませんfoo hello world
)。
ほとんどのUnixバリアントでは、プロセスはps
関数引数の内容を変更して、表示されたコマンドラインを変更できます。バッファを上書きするだけでバッファを長くすることはできませんが、常に短くすることはできます(各引数は最初のNullバイトで終わります)。argv
main
プロセス外でデバッガを実行してプログラムを編集できますargv
。以下は、LinuxでGDBを使用するデモです。
$ sleep 999999.00000000000000000000000000000000000000000000000 &
[1] 2131
$ ps 2131
PID TTY STAT TIME COMMAND
2131 pts/8 S 0:00 sleep 999999.0000000000000000000000000000000000000000
$ gdb -pid 2131
…
(gdb) bt
#0 0x00007fa1206286e0 in __nanosleep_nocancel ()
at ../sysdeps/unix/syscall-template.S:81
#1 0x0000000000403f3f in ?? ()
#2 0x0000000000403d58 in ?? ()
#3 0x00000000004016c9 in ?? ()
#4 0x00007fa120592b45 in __libc_start_main (main=0x401540, argc=2,
argv=0x7fffc8b1bf18, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffc8b1bf08) at libc-start.c:287
#5 0x00000000004017d5 in ?? ()
(gdb) frame 4
#4 0x00007fa120592b45 in __libc_start_main (main=0x401540, argc=2,
argv=0x7fffc8b1bf18, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffc8b1bf08) at libc-start.c:287
(gdb) p argv
$1 = (char **) 0x7fffc8b1bf18
(gdb) p argv[0]
$2 = 0x7fffc8b1d27e "sleep"
(gdb) p argv[1]
$3 = 0x7fffc8b1d284 "999999.", '0' <repeats 47 times>
(gdb) argv[1][9] = 'z'
Undefined command: "argv". Try "help".
(gdb) p argv[1]
$4 = 0x7fffc8b1d284 "999999.00z", '0' <repeats 44 times>
(gdb) detach
Detaching from program: /bin/sleep, process 2131
(gdb) quit
$ ps 2131
PID TTY STAT TIME COMMAND
2131 pts/8 t 0:00 sleep 999999.00z0000000000000000000000000000000000000
システムの構成方法によっては、デバッガで起動されていないプログラムでデバッガを実行することも、実行できない場合もあり、ユーザーが実行していないプログラムではデバッガを実行できません。追加の権限がありません(デバッガをルートとして実行している場合を除く)。これはシステムコールを使用する権限によって制御されますptrace
。