使用一些功能來做到這一點如下。
walk_tasks_backwards_from(current);
功能遵循...
static void walk_tasks_backwards_from(struct task_struct *pos);
static void process_tasks(struct task_struct *parent, struct task_struct *child);
static void process_tasks(struct task_struct *parent, struct task_struct *child) {
pr_alert("parent process: %s, PID: %d\n", parent->comm, parent->pid);
pr_alert("child process: %s, PID: %d\n", child->comm , child->pid);
}
static void walk_tasks_backwards_from(struct task_struct *pos) {
struct task_struct *parent; ;
do {
parent = pos->parent;
process_tasks(parent, pos);
pos = parent;
} while(parent->pid != 0);
}
您可以使用您想從即
walk_tasks_backwards_from(current);
走電流或任何任務時,這會產生我的機器,其中以下輸出調用函數我有一個玩具內核模塊,可以使用cat /dev/toy
[161769.300609] parent process: bash, PID: 918
[161769.301299] child process: cat, PID: 2803
[161769.301973] parent process: login, PID: 626
[161769.302632] child process: bash, PID: 918
[161769.303216] parent process: systemd, PID: 1
[161769.303797] child process: login, PID: 626
[161769.304355] parent process: swapper/0, PID: 0
[161769.304978] child process: systemd, PID: 1
另外,您可以使用以下任何...
使用do {} while
task = current;// Get current process
printk(KERN_INFO "process: %s, PID: %d", task->comm, task->pid);
do {
task = task->parent;
printk(KERN_INFO "process: %s, PID: %d", task->comm, task->pid);
} while (task->pid != 0);
//task here has pid == 0;
或使用while循環。
task = current;// Get current process
while (task->pid != 0) {
printk(KERN_INFO "process: %s, PID: %d", task->comm, task->pid);
task = task->parent;
}
//task here has pid == 0;
printk(KERN_INFO "process: %s, PID: %d", task->comm, task->pid);
遍歷一切
struct task_struct task;
for_each_process(task) {
printk(KERN_INFO "process: %s, PID: %d", task->comm, task->pid);
}
另外:如果有這樣的事情,這將是一個「反向逗號運算符」的可愛應用程序:像逗號運算符,除了它的值是第一個操作數而不是第二個操作數。例如,如果':'是一個這樣的操作符,那麼我們可以在(t:t = t-> parent);'時寫'do {...}。 –