C中内核space遍历祖先的结束标志

The ending flag to traversing ancestors in the kernel space in C

我正在尝试遍历一个进程的所有祖先,以将它们的信息存储在用户传递的静态数组中,并且我正在使用 NULL 指针结束标志来结束遍历。然而,这似乎不起作用,并且会继续循环,直到用户space传递的大小数字(数组的容量)匹配num_filed中的数字(数组中的元素数)所有情况,即使我的进程数量很少 运行。那么,穿越祖宗的终结标志似乎是什么呢?这是我的遍历循环代码:

current_process = current;
int i = 0;
while (current_process != NULL && current_num_filled < size) {
    temp_info_array[i] = get_process_info(current_process);
    ++current_num_filled;
    ++i;
    current_process = current_process->parent;
}

这取决于您的 OS 编码 "root process" 概念的方式。 "NULL" 不是唯一的方法。类似情况下的另一种常见解决方案是将 "parent" 字段设置为 "current_process" 本身。我猜你的 OS 就是这样的。这解释了为什么你的循环在缓冲区 space 耗尽之前不会结束。

您可以按如下方式浏览列表...

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

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

您可以在/include/linux/init_task.h中看到用于为init进程初始化struct task_structINIT_TASK()宏。特别是:

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

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