processtree.c

来自「使用内核编程」· C语言 代码 · 共 67 行

C
67
字号

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/sched.h>
#include<linux/list.h>
#include<linux/proc_fs.h>
#include<asm/uaccess.h>
#define N 200

MODULE_LICENSE("GPL");

struct mytask{
	int pid;
	int parent_pid;
	char name[16];
};

int mystrlen(char name[]){
	int i;
	for(i=0; i<16; i++)
		if(name[i]=='\0')
			break;
	return i;
}

void travel(struct mytask task[], int flag[], int num, int i, int t){
	int k, count = 0;
	for(k=0; k<t+1; k++)
		printk(" ");
	printk("|-%s-",task[i].name);
	flag[i] = 0;
	for(k=0; k<num; k++)
		if(flag[k] && task[k].parent_pid == task[i].pid){
			count++;
			printk("\n");
			travel(task, flag, num, k, t+mystrlen(task[i].name)+2);
		}
	if(count == 0)
		printk("\b");
}

static int processtree_init(void){
	struct task_struct *p;
	struct mytask mytask[N];
	int i = 0, j, flag[N];
	for(j=0; j<N; j++)
		flag[j] = 1;
	for_each_process(p){
		if((p->pid)>0){
			mytask[i].pid = p->pid;
			mytask[i].parent_pid = p->parent->pid;
			for(j=0; j<16; j++)
				mytask[i].name[j] = p->comm[j];
			i++;
		}
	}
	travel(mytask, flag, i, 0, 0);
	return 0;
}

static void processtree_cleanup(void)
{
}

module_init(processtree_init);
module_exit(processtree_cleanup);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?