psコマンドで表示されるコマンド名
psコマンドで表示されるコマンド名はどこからもってくるのだろうと、まあ、どうでもいいことなのですが、カーネルを読むきっかけということで、
p/s
ほかのシェルだとどうだろう?
[root@KURO-BOXHG test]# ./abc.out & [1] 12726 [root@KURO-BOXHG test]# ps PID TTY TIME CMD 12676 pts/2 00:00:00 bash 12726 pts/2 00:00:00 abc.out 12729 pts/2 00:00:00 psstraceしてみると、どうやら/procから取得しているようでした。task_structにコマンド名を設定するところってあっただろうか?とinodeにファイル名を持たせていない事実と勘違いしていました。
[root@KURO-BOXHG test]# strace ps ・・・・ open("/proc/12813/stat", O_RDONLY) = 5 read(5, "12813 (abc.out) S 12676 12813 12"..., 1023) = 205 close(5) = 0 open("/proc/12813/status", O_RDONLY) = 5 read(5, "Name:\tabc.out\nState:\tS (sleeping"..., 1023) = 643 close(5) ・・・・procソースのどこの関数からとNameをキーにfindしてみると、、task_name関数で/prco/pid/statusからコマンド名を取得できるようになっていました。実際取得しているのはget_task_commで、task_struct->commからです。
static inline void task_name(struct seq_file *m, struct task_struct *p) { int i; char *buf, *end; char *name; char tcomm[sizeof(p->comm)]; get_task_comm(tcomm, p); seq_printf(m, "Name:\t"); end = m->buf + m->size; buf = m->buf + m->count; name = tcomm; ・・・・で、task_strucをみてみるとcommのサイズは16バイトでした。ということは16文字を超えるコマンド名はすべて表示されないということです。
[root@KURO-BOXHG test]# ./abcdefghijklemopqrstuvwxyz.out & [1] 12758 [root@KURO-BOXHG test]# ps PID TTY TIME CMD 12676 pts/2 00:00:00 bash 12758 pts/2 00:00:00 abcdefghijklemo 12779 pts/2 00:00:00 psで、killしてみると・・・、ちゃんとしたコマンド名が表示されています。たぶんkillコマンドが表示させているんだと思いますが、でもどうやってコマンド名を取得しているんだろう?
[root@KURO-BOXHG test]# kill 12758 [2]+ 終了しました ./abcdefghijklemopqrstuvwxyz.outそう思って、別のターミナルをあけてそこからkillすると、killしたターミナルでなく、プロセスを起動したターミナルにこのメッセージが表示されました。bashが起動毎にプロセスidとコマンド名を管理して、そいつを表示させていそうです。
p/s
ほかのシェルだとどうだろう?