在C中遍历内核空间中的祖先的结束标志

我试图遍历进程的所有祖先,将其信息存储在用户传递的静态数组中,并且我使用NULL指针结束标志来结束遍历。 但是,这似乎不起作用,并且将继续循环,直到用户空间传递的大小编号(数组的容量)在所有情况下都匹配num_filed数字(数组中的元素数量),即使我有运行的进程数量很少。 那么,什么似乎是穿越祖先的结束标志? 这是我的遍历循环代码:

current_process = current; int i = 0; while (current_process != NULL && current_num_filled parent; } 

您可以在INIT_TASK()中看到用于初始化init进程的struct task_structINIT_TASK()宏。 特别是:

  #define INIT_TASK(tsk) \ { \ .state = 0, \ .stack = &init_thread_info, \ \ /* ... */ \ \ .real_parent = &tsk, \ .parent = &tsk, \ \ /* ... */ \ } 

正如您所看到的 – init的struct task_structparent成员设置为指向自身,而不是空指针。

这取决于您的操作系统编码“根进程”概念的方式。 “NULL”不是唯一的方法。 类似情况下的另一种常见解决方案是将“父”字段设置为“current_process”本身。 我想你的操作系统就是这样的。 这解释了为什么在缓冲区空间耗尽之前,循环不会结束。

您可以按以下方式查看列表……

  struct task_struct *task = current; do { task = task->parent; printk(KERN_INFO "process=%s, pid=%d", task->comm, task->pid); } while (task->pid != 0); 

不要在中断上下文中执行此操作。