⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 processtree.c

📁 使用内核编程
💻 C
字号:

#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -