0

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

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

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

这是结果(pid显示在进程名称的左侧): 在此处输入图像描述

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

4

2 回答 2

1

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

于 2016-04-17T06:25:56.483 回答
1

您看到的正是进程名称,交换进程在 SMP 系统上按 CPU 运行每个实例,并通过将进程号附加到它来区分它们,因此在第一个 CPU 上,进程是swapper/0,在第二个它将是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 编号。

于 2016-04-17T07:15:32.590 回答