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

📄 statfile.c

📁 linux/unix下c/s形式的资源监视,客户端负责搜集机器,再传送到服务端.
💻 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 + -