打印 `current` task_struct, Linux 内核的 comm 字段

printing the comm field of the `current` task_struct, Linux kernel

我正在尝试打印 current task_structcomm 字段以打印进程的名称。然后,使用 current->parent,我想对所有当前进程的祖先做同样的事情。

这是我目前得到的:

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

这是结果(pid 显示在进程名称的左侧):

如您所见,第一个和最后一个进程打印不正确。我明白为什么第一个被截断了——current->comm 是一个 16 char 的数组,所以 process_ancestor 中的最后一个 "r" 根本没有空间(我的程序的名称)。但是,我不明白为什么 swapper 附加了空终止符。有没有可能这实际上是进程的名称?还是有其他问题?

名称以文字字符斜杠和数字零结尾。没有办法将文字 ASCII 零作为字符串传递,因为它在 C 中标记字符串的结尾。(无论如何,传统的转义表示将使用反斜杠,而不是常规的正斜杠。)

你看到的正是进程名,swapper 进程在 SMP 系统上每个 CPU 运行每个实例,它们通过附加进程号来区分,所以在 1st 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在头文件中定义为"swapper",cpu是当前的cpu数。