【发布时间】:2015-07-07 15:49:21
【问题描述】:
#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)
我认为错误消息试图说“&init_task”应该有“struct task_struct”但这还不够吗?据我所知,变量“init_task”是在“linux/sched.h”中外部声明的,这意味着错误不应该是由于无法定位或找到“init_task”造成的。
由于指针应该在'->'之前,使用'&init_task'似乎是正确的。
有人能指出我在这里缺少什么吗?
---更新:已解决---
重新考虑 '->' 和 '&' 的运算符优先级,正确使用是 '(&init_task)->children' 或 'init_task.children'。但是,即使进行了更改,也出现了错误:
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)
这个错误信息指出我应该在“struct task_struct”中提供“children”的地址。因此,我将有问题的行更改为:
list_for_each(list,&(init_task.children)){
解决了问题,编译顺利。
【问题讨论】: