📄 ps_read.c
字号:
/* * Monitor-Server/ps_read.c * * Copyright (C) 2004 Jian Shen <shenjian@net.pku.edu.cn> */#include "statinfo.h"#include "socket.h"#include <asm/semaphore.h>#include <linux/unistd.h>#include <linux/fs.h>#include <linux/slab.h>#include <linux/string.h>#include <linux/seq_file.h>struct pinfo { int NR_PROCS; proc_list_t* proclist; proc_stat_t* proc_data;};/*****************************************************/static void *ps_start(struct seq_file *m, loff_t *pos){// printk("ps_start\n"); struct pinfo* pin = (struct pinfo*)m->private; return *pos < pin->NR_PROCS ? pin->proc_data + *pos : NULL;}static void *my_start(struct seq_file *m, loff_t *pos){ struct pinfo* pin = (struct pinfo*)m->private; return *pos < pin->NR_PROCS ? pin->proc_data + *pos : NULL;}static void *ps_next(struct seq_file *m, void *p, loff_t *pos){// printk("ps_next: %d\n", (int)*pos); ++*pos; return my_start(m, pos);}static void ps_stop(struct seq_file *m, void *p){// printk("ps_stop\n");}static int ps_show(struct seq_file *m, void *p){ proc_stat_t *proc = (proc_stat_t*)p; /* seperate with a tab */ seq_printf(m, "%s\t%d\t%d\t%s\t%s\t%d\t%d\t%c\t%d\t%d\t%s\t%s\t%d:%d:%d:%d\t%s\t%s\t%s\n", proc->user, proc->pid, proc->ppid, proc->cpu_percent, proc->mem_percent, proc->vsize, proc->rss, proc->state, proc->last_cpu, proc->page_fault, proc->usr_time, proc->sys_time, proc->time_lasting.day, proc->time_lasting.hour, proc->time_lasting.minute, proc->time_lasting.second, proc->command, proc->cwd, proc->exe ); return 0;}struct seq_operations ps_op = { start: ps_start, next: ps_next, stop: ps_stop, show: ps_show,};static int ps_open(struct inode *inode, struct file *file){// printk("ps_open\n"); struct dentry *parent = file->f_dentry->d_parent; struct pinfo *pin; struct seq_file *m; int ret; pin = (struct pinfo*)kmalloc(sizeof(struct pinfo), GFP_KERNEL); if(pin == NULL) { printk(KERN_ERR "Kmalloc failed.\n"); return -ENOMEM; /* Out of memory */ } pin->proclist = (proc_list_t*)kmalloc(sizeof(proc_list_t), GFP_KERNEL); if(pin->proclist == NULL) { printk(KERN_ERR "Kmalloc failed.\n"); return -ENOMEM; /* Out of memory */ } if(ps_get_proc_list(parent->d_name.name, pin->proclist) < 0) { kfree(pin->proclist); return -EPIPE; /* Broken pipe */ } pin->NR_PROCS = pin->proclist->num_of_procs;// printk("NR_PROCS: %d\n", NR_PROCS); pin->proc_data = &(pin->proclist->procs[0]); ret = seq_open(file, &ps_op); m = (struct seq_file*)file->private_data; m->private = pin; return ret;}static int ps_release(struct inode *inode, struct file *file){// printk("ps_release\n"); int ret; struct seq_file *m = (struct seq_file*)file->private_data; struct pinfo* pin = (struct pinfo*)m->private; if(pin == NULL) return seq_release(inode, file); if(pin->proclist != NULL) kfree(pin->proclist); kfree(pin); ret = seq_release(inode, file); return ret;}struct file_operations proc_ps_operations = { open: ps_open, read: seq_read, llseek: seq_lseek, release: ps_release,};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -