2016-04-17 103 views
0

currenttask_structcommフィールドを印刷して、プロセスの名前を表示しようとしています。そして、current->parentを使って、私はすべての現在のプロセスの祖先について同じことをしたいと思います。Linuxカーネルの `current` task_structのcommフィールドを出力する

while (there is still an ancestor of current to print) { 
... 
    printk("Name: %s", current_task->comm); 
... 
} 

をそしてここで(プロセス名の左側に示さpid)の結果です: enter image description here

は、あなたが見ることができるように、最初にここで

は、私がこれまで持っているものです最後のプロセスが正しく印刷されません。私はなぜ最初のものが切り捨てられているのか理解しています - current->commは16 charの配列なので、process_ancestor(プログラムの名前)に最終的な "r"の余地はありません。しかし、なぜ swapperにnullターミネータが付加されているのか分かりません。これが実際にプロセスの名前である可能性はありますか?それとも何か他にうまくいかないのですか?

答えて

1

表示内容swapperプロセスはSMPシステム上でCPUごとに各インスタンスを実行し、プロセス番号を付加することで区別されるため、最初のCPUではプロセスはswapper/0、2番目のプロセスはswapper/1、等々。 あなたはカーネルソースで見つけることができます:ここで

http://lxr.free-electrons.com/source/kernel/sched/core.c?v=3.5#L5136

#if defined(CONFIG_SMP) 
    sprintf(idle->comm, "%s/%d", INIT_TASK_COMM, cpu); 
#endif 

INIT_TASK_COMMONは、ヘッダー・ファイル内の「スワッピング」として定義され、CPUは、現在のCPUの数です。

1

名前は、リテラル文字のスラッシュと数字のゼロで終わります。リテラルのASCIIゼロを文字列として渡す方法はありません。これはCの文字列の終わりを示すためです(通常のスラッシュではなく円記号を使用します)。

+0

奇妙な命名規則。それを指摘してくれてありがとう – Adam

関連する問題