LINUX LISH.H list_for_each无限循环

时间:2014-02-19 10:28:31

标签: linux linux-kernel linked-list infinite-loop

我正在尝试实现task_struct列表并将其用作FIFO。另外,我需要一个函数来遍历列表并搜索特定任务。

我的问题是list_for_each宏陷入无限循环。

以下是我的代码中的代码段:

typedef struct task_list_node {
   struct list_head next;
   struct task_struct *task;
} task_list_node;

task_list_node * find(struct semaphore *sem) 
{
   struct list_head * next;
   struct list_head task_list = sem->task_list;

   list_for_each(next, &task_list) {
      task_list_node * elem;
      // Get a pointer to the element on the list
      elem = list_entry(next, task_list_node, next);

      // [...]

   }
   return(NULL);   
}

提前感谢任何提示!

1 个答案:

答案 0 :(得分:1)

list_for_each()本身没问题。

#define list_for_each(pos,head)\     for(pos =(head) - > next; pos!=(head); pos = pos-> next)

问题是:struct list_head task_list = sem-> task_list;

您正在创建如下结构:

    |--------------------------------------------------------
   \/                                                       |
 head #a "sem->task_list"  ---element 1 .... element #N -----
                                   ^
 head #b "task_list" --------------|

list_for_each()应该在“pos”== head #a时停止,但是你没有使用头#a“sem-> task_list”进行迭代,但是头#b“task_list”,所以停止条件为“ pos“==”task_list“未到达。

应修复如下:

list_for_each(next, &sem->task_list) {