' - >'的无效类型参数

时间:2015-07-07 15:49:21

标签: c kernel

#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)){

解决了这个问题,编译顺利进行。

1 个答案:

答案 0 :(得分:5)

init_task是一个结构,而不是指针。因此,您应该在取消引用(&init_task)->children之前将其转换为指针,或者使用句点符号children访问init_task.children&init_task->children表示children指向的init_task字段的地址,如果它是指针的话。