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

时间:2016-04-17 06:05:13

标签: linux kernel printk

我尝试打印comm current的{​​{1}}字段以打印进程名称。然后,使用task_struct,我想为所有当前进程的祖先做同样的事情。

这是我到目前为止所得到的:

current->parent

结果是(while (there is still an ancestor of current to print) { ... printk("Name: %s", current_task->comm); ... } 显示在流程名称的左侧): enter image description here

如您所见,第一个和最后一个进程无法正确打印。我理解为什么第一个被截断 - pid是一个由16 current->comm组成的数组,因此根本没有空间可以进行最终的" r" in process_ancestor(我的程序名称)。但是,我不明白为什么char附加了空终结符。这有可能是这个过程的名称吗?还是出了别的问题?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您看到的正是进程名称,交换器进程在SMP系统上运行每个CPU的每个实例,并通过向其附加进程号来区分它们,因此在第一个CPU上,进程为{{1} 2,它将是swapper/0,依此类推。 你可以在内核源代码中找到:

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

swapper/1

这里INIT_TASK_COMMON被定义为" swapper"在头文件中,cpu是当前的cpu编号。