📄 statfile.c
字号:
/* * Monitor-Server/statfile.c * * Copyright (C) 2004 Jian Shen <shenjian@net.pku.edu.cn> */#include "statfile.h"#include "nodelist.h"#include "socket.h"#include "statinfo.h"/****************************************************/#define PS_BUF_LEN sizeof(proc_list_t)void printk_proc_list(proc_list_t* plist){ int i; for(i=0; i<plist->num_of_procs; i++) { printk(KERN_INFO "%s %c %d %d %s %s %s\n", plist->procs[i].user, plist->procs[i].state, plist->procs[i].pid, plist->procs[i].ppid, plist->procs[i].cpu_percent, plist->procs[i].mem_percent, plist->procs[i].command); }}#define WITH_TAB 1int print_proclist(proc_list_t* plist, char* buf){ int i, len = 0; if(plist == NULL || buf == NULL) return -1;#if WITH_TAB /* seperate with a tab *//* sprintf(buf, "USER\tPID\tPPID\t%sCPU\t%sMEM\tVSZ\tRSS\tSTAT\tLCPU\tPF\tUSR\tSYS\tTIME\tCOMMAND\tCWD\tEXEC\n", "%", "%"); */ for(i=0; i<plist->num_of_procs; i++) { len = sprintf(buf, "%s%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", buf, plist->procs[i].user, plist->procs[i].pid, plist->procs[i].ppid, plist->procs[i].cpu_percent, plist->procs[i].mem_percent, plist->procs[i].vsize, plist->procs[i].rss, plist->procs[i].state, plist->procs[i].last_cpu, plist->procs[i].page_fault, plist->procs[i].usr_time, plist->procs[i].sys_time, plist->procs[i].time_lasting.day, plist->procs[i].time_lasting.hour, plist->procs[i].time_lasting.minute, plist->procs[i].time_lasting.second, plist->procs[i].command, plist->procs[i].cwd, plist->procs[i].exe ); }#else /* seperate with a blank *//* sprintf(buf, "USER PID PPID %sCPU %sMEM VSZ RSS STAT LCPU PF USR SYS TIME COMMAND CWD EXEC\n", "%", "%"); */ for(i=0; i<plist->num_of_procs; i++) { len = sprintf(buf, "%s%s %d %d %s %s %d %d %c %d %d %s %s %d:%d:%d:%d %s %s %s\n", buf, plist->procs[i].user, plist->procs[i].pid, plist->procs[i].ppid, plist->procs[i].cpu_percent, plist->procs[i].mem_percent, plist->procs[i].vsize, plist->procs[i].rss, plist->procs[i].state, plist->procs[i].last_cpu, plist->procs[i].page_fault, plist->procs[i].usr_time, plist->procs[i].sys_time, plist->procs[i].time_lasting.day, plist->procs[i].time_lasting.hour, plist->procs[i].time_lasting.minute, plist->procs[i].time_lasting.second, plist->procs[i].command, plist->procs[i].cwd, plist->procs[i].exe ); }#endif return len;}int ps_read(char* sys_buffer, char** my_buffer, off_t offset, int buffer_length, int *eof, void* data){ proc_list_t* proclist = NULL; struct proc_dir_entry* self = (struct proc_dir_entry*)data; static int len; int amount = 0; static char buf[PS_BUF_LEN]; if(offset > 0) {#ifndef OLD_PROC *my_buffer = &buf[offset];#endif goto ret; } memset(buf, '\0', PS_BUF_LEN); proclist = (proc_list_t*)kmalloc(sizeof(proc_list_t), GFP_KERNEL); if(proclist == NULL) { printk(KERN_ERR "Kmalloc failed.\n"); goto err; } if(ps_get_proc_list(self->parent->name, proclist) < 0) goto err;// printk_proc_list(proclist); len = print_proclist(proclist, buf); if(proclist != NULL) kfree(proclist);#ifndef OLD_PROC *my_buffer = buf;#endif ret: amount = len - offset; if(buffer_length < amount) amount = buffer_length; if(amount == 0) *eof = 1;#ifdef OLD_PROC memcpy(sys_buffer, buf+offset, amount);#endif return amount; err: if(proclist != NULL) kfree(proclist); len = sprintf(buf, "Failed to get process list from %s!\n", self->parent->name);#ifdef OLD_PROC memcpy(sys_buffer, buf, len);#else *my_buffer = buf;#endif return len;}int ps_bin_read(char* sys_buffer, char** my_buffer, off_t offset, int buffer_length, int *eof, void* data){ proc_list_t* proclist = NULL; struct proc_dir_entry* self = (struct proc_dir_entry*)data; static int len; int amount = 0; static char buf[sizeof(proc_list_t)]; if(offset > 0) {#ifndef OLD_PROC *my_buffer = &buf[offset];#endif goto ret; } memset(buf, '\0', sizeof(proc_list_t)); proclist = (proc_list_t*)kmalloc(sizeof(proc_list_t), GFP_KERNEL); if(proclist == NULL) { printk(KERN_ERR "Kmalloc failed.\n"); goto err; } if(ps_get_proc_list(self->parent->name, proclist) < 0) goto err; memcpy(buf, proclist, sizeof(proc_list_t)); len = sizeof(proc_list_t); if(proclist != NULL) kfree(proclist);#ifndef OLD_PROC *my_buffer = buf;#endif ret: amount = len - offset; if(buffer_length < amount) amount = buffer_length; if(amount == 0) *eof = 1;#ifdef OLD_PROC memcpy(sys_buffer, buf+offset, amount);#endif return amount; err: if(proclist != NULL) kfree(proclist); len = sprintf(buf, "Failed to get process list from %s!\n", self->parent->name);#ifdef OLD_PROC memcpy(sys_buffer, buf, len);#else *my_buffer = buf;#endif return len;}/****************************************************************/#define TOP_BUF_LEN 1024int print_sysload(system_load_info* sysload, char* buf){ int i, len = 0; if(sysload == NULL) { printk(KERN_ERR "sysload is NULL.\n"); return 0; } sprintf(buf, "%sOS version: %s %s\n", buf, sysload->sysinfo.sysname, sysload->sysinfo.release); for(i=0; i<sysload->num_of_cpu; i++) { sprintf(buf, "%sCPU%d (%sMHZ): %s%s\n", buf, i, sysload->cpu_freq[i], sysload->cpu_util[i], "%"); } sprintf(buf, "%sTotal memory : %d KB\n", buf, sysload->total_mem); sprintf(buf, "%sFree memory : %d KB\n", buf, sysload->free_mem); len = sprintf(buf, "%sLoad Avarage(1,5,15min) : %s %s %s\n", buf, sysload->loadavg[0], sysload->loadavg[1], sysload->loadavg[2]); return len;}int top_read(char* sys_buffer, char** my_buffer, off_t offset, int buffer_length, int *eof, void* data){ int len = 0; system_load_info *sysload; struct proc_dir_entry* self = (struct proc_dir_entry*)data; static char buf[TOP_BUF_LEN]; memset(buf, '\0', TOP_BUF_LEN); if(offset > 0) return 0; sysload = nlist_get(self->parent->name); len = print_sysload(sysload, buf);#ifdef OLD_PROC memcpy(sys_buffer, buf, len);#else *my_buffer = buf;#endif return len;}int top_bin_read(char* sys_buffer, char** my_buffer, off_t offset, int buffer_length, int *eof, void* data){ int len = 0; system_load_info *sysload; struct proc_dir_entry* self = (struct proc_dir_entry*)data; static char buf[sizeof(system_load_info)]; memset(buf, '\0', sizeof(system_load_info)); if(offset > 0) return 0; sysload = nlist_get(self->parent->name); memcpy(buf, sysload, sizeof(system_load_info)); len = sizeof(system_load_info);#ifdef OLD_PROC memcpy(sys_buffer, buf, len);#else *my_buffer = buf;#endif return len;}/*******************************************************//* new ps operation */extern struct file_operations proc_ps_operations;/*******************************************************/extern struct proc_dir_entry *cluster_dir; /* defined in main.c *///#define SEQ_PS_READint create_file(const char* filename, struct proc_dir_entry **dir){ struct proc_dir_entry *ps_ety = 0; struct proc_dir_entry *top_ety = 0; struct proc_dir_entry *ps_bin_ety = 0; struct proc_dir_entry *top_bin_ety = 0; /* First create node's directory */ *dir = proc_mkdir(filename, cluster_dir); if(!(*dir)) { printk(KERN_ERR "proc_mkdir failed.\n"); return -1; } printk(KERN_DEBUG "mkdir %s in /proc/cluster.\n", filename); /* Create 'ps' */ ps_ety = create_proc_entry(PS_PROC_FILE, 0444, *dir); if(!ps_ety) { printk(KERN_ERR "create_proc_entry 'ps' failed.\n"); goto err; } ps_ety->mode = S_IFREG | 0444; ps_ety->size = 0;#ifdef SEQ_PS_READ ps_ety->proc_fops = &proc_ps_operations;#else ps_ety->read_proc = ps_read;#endif ps_ety->data = (void*)ps_ety; /* Create 'ps.bin' */ ps_bin_ety = create_proc_entry(PS_BIN_PROC_FILE, 0444, *dir); if(!ps_bin_ety) { printk(KERN_ERR "create_proc_entry 'ps.bin' failed.\n"); goto err; } ps_bin_ety->mode = S_IFREG | 0444; ps_bin_ety->size = 0; ps_bin_ety->read_proc = ps_bin_read; ps_bin_ety->data = (void*)ps_bin_ety; /* Create 'top' */ top_ety = create_proc_entry(TOP_PROC_FILE, 0444, *dir); if(!top_ety) { printk(KERN_ERR "create_proc_entry 'top' failed.\n"); goto err; } top_ety->mode = S_IFREG | 0444; top_ety->size = 0; top_ety->read_proc = top_read; top_ety->data = (void*)top_ety; /* Create 'top.bin' */ top_bin_ety = create_proc_entry(TOP_BIN_PROC_FILE, 0444, *dir); if(!top_bin_ety) { printk(KERN_ERR "create_proc_entry 'top.bin' failed.\n"); goto err; } top_bin_ety->mode = S_IFREG | 0444; top_bin_ety->size = 0; top_bin_ety->read_proc = top_bin_read; top_bin_ety->data = (void*)top_bin_ety; return 0; err: if(top_bin_ety != 0) remove_proc_entry(TOP_BIN_PROC_FILE, *dir); if(top_ety != 0) remove_proc_entry(TOP_PROC_FILE, *dir); if(ps_bin_ety != 0) remove_proc_entry(PS_BIN_PROC_FILE, *dir); if(ps_ety != 0) remove_proc_entry(PS_PROC_FILE, *dir); if(*dir != 0) remove_proc_entry(filename, cluster_dir); return -1;}int remove_file(const char* filename, struct proc_dir_entry *dir){ printk(KERN_DEBUG "rmdir %s in /proc/cluster.\n", filename); remove_proc_entry(TOP_BIN_PROC_FILE, dir); remove_proc_entry(TOP_PROC_FILE, dir); remove_proc_entry(PS_BIN_PROC_FILE, dir); remove_proc_entry(PS_PROC_FILE, dir); remove_proc_entry(filename, cluster_dir); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -