#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/module.h>
int start(void){
printk("starting module\n");
printk("pid\ttask_name\tstate\n");
struct task_struct *task;
struct list_head *list;
list_for_each(list,&init_task->children){
task=list_entry(list,struct task_struct,sibling);
printk("%5d\t%s\t%li\n",task->pid,task->comm,task->state);
}
return 0;
}
void ending(void){
printk("closing module\n");
}
module_init(start);
module_exit(ending);
编译时,会出现以下错误
error: invalid type argument of ‘->’ (have ‘struct task_struct’)
list_for_each(list,&init_task->children){
^
include/linux/list.h:408:14: note: in definition of macro ‘list_for_each’
for (pos = (head)->next; pos != (head); pos = pos->next)
我认为错误消息是试图说&#34;&amp; init_task&#34;应该有&#34; struct task_struct&#34;但这还不够吗?据我所知,变量&quot; init_task&#39;在&lt; linux / sched.h&#39;中外部声明。这意味着错误不应该由于无法找到或找到“init_task”而引起。
由于指针应位于&#39; - &gt;&#39;前面,使用&#39;&amp; init_task&#39;似乎是对的。
有人能指出我在这里失踪了吗?
---更新:解决---
重新考虑&#39; - &gt;&#39;的运营商优先顺序和&#39;&amp;&#39;,正确使用是&#39;(&amp; init_task) - &gt;儿童&#39;或者&#39; init_task.children&#39;。但是,即使改变了这一点,也出现了错误:
include/linux/list.h:408:31: error: invalid operands to binary != (have ‘struct list_head *’ and ‘struct list_head’)
for (pos = (head)->next; pos != (head); pos = pos->next)
这个错误消息指出我应该提供“孩子们”的地址。在&#39; struct task_struct&#39;。因此,我将有问题的行改为:
list_for_each(list,&(init_task.children)){
解决了这个问题,编译顺利进行。
答案 0 :(得分:5)
init_task
是一个结构,而不是指针。因此,您应该在取消引用(&init_task)->children
之前将其转换为指针,或者使用句点符号children
访问init_task.children
。 &init_task->children
表示children
指向的init_task
字段的地址,如果它是指针的话。