#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». Таким образом, я изменил проблемную строку как:
list_for_each(list,&(init_task.children)){
что решило проблему, и компиляция прошла гладко.
(&init_task)->children
, потому что->
и.
связаны очень тесно, и более тесно, чем&
(как оператор адреса). 07.07.2015