我尝试打印comm
current
的{{1}}字段以打印进程名称。然后,使用task_struct
,我想为所有当前进程的祖先做同样的事情。
这是我到目前为止所得到的:
current->parent
结果是(while (there is still an ancestor of current to print) {
...
printk("Name: %s", current_task->comm);
...
}
显示在流程名称的左侧):
如您所见,第一个和最后一个进程无法正确打印。我理解为什么第一个被截断 - pid
是一个由16 current->comm
组成的数组,因此根本没有空间可以进行最终的" r" in process_ancestor(我的程序名称)。但是,我不明白为什么char
附加了空终结符。这有可能是这个过程的名称吗?还是出了别的问题?
答案 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编号。