打印 `current` task_struct, Linux 内核的 comm 字段
printing the comm field of the `current` task_struct, Linux kernel
我正在尝试打印 current
task_struct
的 comm
字段以打印进程的名称。然后,使用 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数。
我正在尝试打印 current
task_struct
的 comm
字段以打印进程的名称。然后,使用 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数。