打印task_struct的进程号,优先级,调度策略,状态,CPU和进程名
- pcb.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include "policy.h"
#include "state.h"
static int __init hello_init(void)
{
const struct task_struct *p;
unsigned int nr_cpu;
unsigned int nr_policy;
volatile long nr_state;
static int i;
for (i = 0; i < 10; i++)
printk("\n"); // 清屏专用
printk("list of process information...\n");
for_each_process(p) {
nr_cpu = task_cpu(p);
nr_policy = p->policy;
nr_state = p->state;
printk
("pid:%d \t优先级:%d\t调度策略:%s \t状态:%s \tCPU:%u\t进程名:%s\n",
p->pid, p->normal_prio, tran_policy(nr_policy),
tran_state(nr_state), nr_cpu, p->comm);
}
return 0;
}
static void __exit hello_exit(void)
{
printk("goodbye, kernel.\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
- policy.h
/*
* Scheduling policies
*/
/*
* #define SCHED_NORMAL 0
* #define SCHED_FIFO 1
* #define SCHED_RR 2
* #define SCHED_BATCH 3
*/
/* SCHED_ISO: reserved but not implemented yet */
/*
* #define SCHED_IDLE 5
*/
/* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */
/*
* #define SCHED_RESET_ON_FORK 0x40000000
*/
char *tran_policy(unsigned int policy)
{
char *cp;
switch (policy) {
case 0:
cp = "SCHED_NORMAL";
break;
case 1:
cp = "SCHED_FIFO";
break;
case 2:
cp = "SCHED_RR ";
break;
case 3:
cp = "SCHED_BATCH";
break;
case 5:
cp = "SCHED_IDLE";
break;
case 0x40000000:
cp = "SCHED_RESET_ON_FORK";
break;
default:
cp = "unknown";
break;
}
return cp;
}
- state.h
/*
* #define TASK_RUNNING 0
* #define TASK_INTERRUPTIBLE 1
* #define TASK_UNINTERRUPTIBLE 2
* #define __TASK_STOPPED 4
* #define __TASK_TRACED 8
*/
/* in tsk->exit_state */
/*
* #define EXIT_ZOMBIE 16
* #define EXIT_DEAD 32
*/
/* in tsk->state again */
/*
* #define TASK_DEAD 64
* #define TASK_WAKEKILL 128
* #define TASK_WAKING 256
* #define TASK_PARKED 512
*/
char *tran_state(volatile long state)
{
char *s = NULL;
switch (state) {
case 0:
s = "TASK_RUNNING ";
break;
case 1:
s = "TASK_INTERRUPTIBLE";
break;
case 2:
s = "TASK_UNINTERRUPTIBLE";
break;
case 4:
s = "__TASK_STOPPED";
break;
case 8:
s = "__TASK_TRACED";
break;
case 16:
s = "EXIT_ZOMBIE";
break;
case 32:
s = "EXIT_DEAD";
break;
case 64:
s = "TASK_DEAD";
break;
case 128:
s = "TASK_WAKEKILL";
break;
case 256:
s = "TASK_WAKING";
break;
case 512:
s = "TASK_PARKED";
break;
default:
s = "unknown ";
break;
}
return s;
}
- Makefile
ifneq ($(KERNELRELEASE),)
obj-m := pcb.o
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
endif
运行结果