psコマンドで表示されるコマンド名


Rev.7を表示中。最新版はこちら

psコマンドで表示されるコマンド名はどこからもってくるのだろうと、
[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 ps
straceしてみると、どうやら/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
ほかのシェルだとどうだろう?

最終更新 2010/03/21 16:04:46 - north
(2010/03/20 14:22:31 作成)


検索

アクセス数
3689609
最近のコメント
コアダンプファイル - sakaia
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
Adsense
広告情報が設定されていません。