無料Wikiサービス | デモページ
検索

アクセス数
最近のコメント
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
はじめ - ノース
はじめ - 楽打連動ユーザー
はじめ - 楽打連動ユーザー
Adsense
広告情報が設定されていません。

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


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 19:06:59 - north
(2010/03/20 14:22:31 作成)