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_struct
的INIT_TASK()
宏。特别是:
#define INIT_TASK(tsk) \
{ \
.state = 0, \
.stack = &init_thread_info, \
\
/* ... */ \
\
.real_parent = &tsk, \
.parent = &tsk, \
\
/* ... */ \
}
正如您所见 - init 的 struct task_struct
的 parent
成员被设置为指向自身,而不是空指针。
我正在尝试遍历一个进程的所有祖先,以将它们的信息存储在用户传递的静态数组中,并且我正在使用 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_struct
的INIT_TASK()
宏。特别是:
#define INIT_TASK(tsk) \
{ \
.state = 0, \
.stack = &init_thread_info, \
\
/* ... */ \
\
.real_parent = &tsk, \
.parent = &tsk, \
\
/* ... */ \
}
正如您所见 - init 的 struct task_struct
的 parent
成员被设置为指向自身,而不是空指针。