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

📄 monitor.c

📁 系统任务管理器
💻 C
📖 第 1 页 / 共 4 页
字号:
/* GKrellM|  Copyright (C) 1999-2006 Bill Wilson||  Author:  Bill Wilson    billw@gkrellm.net|  Latest versions might be found at:  http://gkrellm.net||  This program is free software which I release under the GNU General Public|  License. You may redistribute and/or modify this program under the terms|  of that license as published by the Free Software Foundation; either|  version 2 of the License, or (at your option) any later version.||  This program is distributed in the hope that it will be useful,|  but WITHOUT ANY WARRANTY; without even the implied warranty of|  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the|  GNU General Public License for more details.  Version 2 is in the|  COPYRIGHT file in the top level directory of this distribution.| |  To get a copy of the GNU General Puplic License, write to the Free Software|  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/#include "gkrellmd.h"#include "gkrellmd-private.h"GList			*gkrellmd_monitor_list;static GList	*serveflag_done_list;static struct tm	gkrellmd_current_tm;gintgkrellm_get_timer_ticks(void)	{	return GK.timer_ticks;	}gbooleangkrellmd_check_client_version(GkrellmdMonitor *mon,				gint major, gint minor, gint rev)	{	GkrellmdClient	*client = mon->privat->client;	if (   client->major_version > major		|| (client->major_version == major && client->minor_version > minor)	    || (   client->major_version == major && client->minor_version == minor			&& client->rev_version >= rev		   )	   )		return TRUE;	return FALSE;	}voidgkrellmd_add_serveflag_done(gboolean *flag)	{	serveflag_done_list = g_list_append(serveflag_done_list, flag);	}voidgkrellmd_set_serve_name(GkrellmdMonitor *mon, const gchar *tag)	{	GkrellmdMonitorPrivate	*mp = mon->privat;	mp->serve_name = tag;	mp->serve_name_sent = FALSE;	}voidgkrellmd_serve_data(GkrellmdMonitor *mon, gchar *line)	{	GkrellmdMonitorPrivate	*mp = mon->privat;	gchar					buf[128];	if (!line || !*line)		return;	if (!mp->serve_name_sent)		{		if (mp->serve_name)			{			snprintf(buf, sizeof(buf), "<%s>\n", mp->serve_name);			mp->serve_gstring = g_string_append(mp->serve_gstring, buf);			mp->serve_name_sent = TRUE;			}		else			{			printf("gkrellmd: %s forgot to gkrellmd_set_serve_name()\n",					mon->name);			return;			}		}	mp->serve_gstring = g_string_append(mp->serve_gstring, line);	}/* ======================================================= */typedef struct	{	gint	instance;	gulong	user,			nice,			sys,			idle;	}	CpuData;static gchar	*n_cpus_setup;static gboolean	nice_time_unsupported;static GList	*cpu_list;static GList	*instance_list;voidgkrellm_cpu_set_number_of_cpus(gint n)	{	CpuData	*cpu;	GList	*list;	gint	i;	n_cpus_setup = g_strdup_printf("n_cpus %d\n", n);	for (i = 0; i < n; ++i)		{		cpu = g_new0(CpuData, 1);		cpu_list = g_list_append(cpu_list, cpu);		if (instance_list && (list = g_list_nth(instance_list, i)) != NULL)			cpu->instance = GPOINTER_TO_INT(list->data);		else			cpu->instance = i;		}	}voidgkrellm_cpu_add_instance(gint instance)	{	instance_list = g_list_append(instance_list, GINT_TO_POINTER(instance));	}voidgkrellm_cpu_nice_time_unsupported(void)	{	nice_time_unsupported = TRUE;	}voidgkrellm_cpu_assign_composite_data(gulong user, gulong nice,			gulong sys, gulong idle)	{	return;		/* let client gkrellm compute it */	}voidgkrellm_cpu_assign_data(gint n, gulong user, gulong nice,			gulong sys, gulong idle)	{	CpuData	*cpu = NULL;	GList	*list;	for (list = cpu_list; list; list = list->next)		{		cpu = (CpuData *) list->data;		if (cpu->instance == n)			break;		}	if (list)		{		cpu->user = user;		cpu->nice = nice;		cpu->sys = sys;		cpu->idle = idle;		}	}static voidupdate_cpu(GkrellmdMonitor *mon, gboolean first_update)	{	gkrellm_sys_cpu_read_data();	gkrellmd_need_serve(mon);	}static voidserve_cpu_data(GkrellmdMonitor *mon, gboolean first_serve)	{	CpuData	*cpu;	GList	*list;	gchar	buf[128];	gkrellmd_set_serve_name(mon, "cpu");	for (list = cpu_list; list; list = list->next)		{		cpu = (CpuData *) list->data;		sprintf(buf, "%d %lu %lu %lu %lu\n", cpu->instance,				cpu->user, cpu->nice, cpu->sys, cpu->idle);		gkrellmd_serve_data(mon, buf);		}	}static voidserve_cpu_setup(GkrellmdMonitor *mon)	{	GkrellmdClient	*client = mon->privat->client;	GList			*list;	gchar			buf[64];	gkrellmd_send_to_client(client, "<cpu_setup>\n");	for (list = instance_list; list; list = list->next)		{		snprintf(buf, sizeof(buf), "cpu_instance %d\n",				GPOINTER_TO_INT(list->data));		gkrellmd_send_to_client(client, buf);		}	gkrellmd_send_to_client(client, n_cpus_setup);	if (nice_time_unsupported)		gkrellmd_send_to_client(client, "nice_time_unsupported\n");	}static GkrellmdMonitor cpu_monitor =	{	"cpu",	update_cpu,	serve_cpu_data,	serve_cpu_setup	};static GkrellmdMonitor *init_cpu_monitor(void)	{	if (gkrellm_sys_cpu_init())		return &cpu_monitor;	return NULL;	}/* ======================================================= */struct	{	gboolean	changed;	gint		n_processes,				n_running,				n_users;	gulong		n_forks;	gfloat		fload;	}	proc;voidgkrellm_proc_assign_data(gint n_processes, gint n_running,			gulong n_forks, gfloat load)	{	if (   proc.n_processes != n_processes		|| proc.n_running != n_running		|| proc.n_forks != n_forks		|| proc.fload != load	   )		{		proc.n_processes = n_processes;		proc.n_running = n_running;		proc.n_forks = n_forks;		proc.fload = load;		proc.changed = TRUE;		}	}voidgkrellm_proc_assign_users(gint n_users)	{	if (proc.n_users != n_users)		{		proc.n_users = n_users;		proc.changed = TRUE;		}	}static voidupdate_proc(GkrellmdMonitor *mon, gboolean first_update)	{	proc.changed = FALSE;	gkrellm_sys_proc_read_data();	if (first_update || GK.five_second_tick)		gkrellm_sys_proc_read_users();	if (proc.changed)		gkrellmd_need_serve(mon);	}static voidserve_proc_data(GkrellmdMonitor *mon, gboolean first_serve)	{	gchar	buf[128];	gkrellmd_set_serve_name(mon, "proc");	snprintf(buf, sizeof(buf), "%d %d %lu %.2f %d\n",			 proc.n_processes, proc.n_running,			 proc.n_forks, proc.fload, proc.n_users);	gkrellmd_serve_data(mon, buf);	}static GkrellmdMonitor proc_monitor =	{	"proc",	update_proc,	serve_proc_data,	NULL	};static GkrellmdMonitor *init_proc_monitor(void)	{	if (!gkrellm_sys_proc_init())		return NULL;	serveflag_done_list = g_list_append(serveflag_done_list, &proc.changed);	return &proc_monitor;	}/* ======================================================= */typedef struct	{	gchar		*name;	gchar		*subdisk_parent;	gint		order,				subdisk,				changed;	gint		device_number,				unit_number;	gboolean	virtual;	guint64		rb,				wb;	}	DiskData;static GList	*disk_list;static gint		n_disks;static gboolean	units_are_blocks;static DiskData *add_disk(gchar *name, gint order, gint device_number, gint unit_number)	{	DiskData	*disk;	GList		*list;	gint		i;	disk = g_new0(DiskData, 1);	disk->name = g_strdup(name);	disk->order = order;	disk->subdisk = -1;	disk->device_number = device_number;	disk->unit_number = unit_number;	if (order >= 0)		{		for (i = 0, list = disk_list; list; list = list->next, ++i)			if (disk->order < ((DiskData *) list->data)->order)				break;		disk_list = g_list_insert(disk_list, disk, i);		}	else		disk_list = g_list_append(disk_list, disk);	++n_disks;	return disk;	}static DiskData *add_subdisk(gchar *subdisk_name, gchar *disk_name, gint subdisk)	{	DiskData	*sdisk = NULL;#if GLIB_CHECK_VERSION(2,0,0)	DiskData	*disk;	GList		*list = NULL;	for (list = disk_list; list; list = list->next)		{		disk = (DiskData * ) list->data;		if (!strcmp(disk_name, disk->name))			break;		}	if (!list)		return NULL;	sdisk = g_new0(DiskData, 1);	sdisk->name = g_strdup(subdisk_name);	sdisk->subdisk_parent = g_strdup(disk_name);	sdisk->order = disk->order;	sdisk->subdisk = subdisk;	for (list = list->next; list; list = list->next)		{		disk = (DiskData * ) list->data;		if (disk->subdisk == -1 || disk->subdisk > subdisk)			break;		}	disk_list = g_list_insert_before(disk_list, list, sdisk);	++n_disks;#endif	return sdisk;	}static voiddisk_assign_data(DiskData *disk, guint64 rb, guint64 wb, gboolean virtual)	{	if (disk)		{		if (disk->rb != rb || disk->wb != wb)			disk->changed = TRUE;		else			disk->changed = FALSE;		disk->rb = rb;		disk->wb = wb;		disk->virtual = virtual;		}	}voidgkrellm_disk_reset_composite(void)	{	/* Don't handle this. */	}voidgkrellm_disk_units_are_blocks(void)	{	units_are_blocks = TRUE;	}voidgkrellm_disk_assign_data_by_device(gint device_number, gint unit_number,			guint64 rb, guint64 wb, gboolean virtual)	{	GList		*list;	DiskData	*disk = NULL;	gchar		*name;	gint		order = -1;	for (list = disk_list; list; list = list->next)		{		disk = (DiskData * ) list->data;		if (   disk->device_number == device_number			&& disk->unit_number == unit_number		   )			break;		disk = NULL;		}	if (!disk)		{		name = gkrellm_sys_disk_name_from_device(device_number,					unit_number, &order);		if (name)			disk = add_disk(name, order, device_number, unit_number);		}	disk_assign_data(disk, rb, wb, virtual);	}voidgkrellm_disk_assign_data_nth(gint n, guint64 rb, guint64 wb, gboolean virtual)	{	DiskData	*disk;	gchar		name[32];	if (n < n_disks)		disk = (DiskData *) g_list_nth_data(disk_list, n);	else		{		sprintf(name, "%s%c", _("Disk"), 'A' + n);		disk = add_disk(name, n, 0, 0);		}	disk_assign_data(disk, rb, wb, virtual);	}voidgkrellm_disk_assign_data_by_name(gchar *name,			guint64 rb, guint64 wb, gboolean virtual)	{	GList		*list;	DiskData	*disk = NULL;	gint		order = -1;	for (list = disk_list; list; list = list->next)		{		disk = (DiskData * ) list->data;		if (!strcmp(name, disk->name))			break;		disk = NULL;		}	if (!disk)		{		order = gkrellm_sys_disk_order_from_name(name);		disk = add_disk(name, order, 0, 0);		}	disk_assign_data(disk, rb, wb, virtual);	}voidgkrellm_disk_subdisk_assign_data_by_name(gchar *subdisk_name, gchar *disk_name,				guint64 rb, guint64 wb)	{	GList		*list;	DiskData	*disk = NULL;	gchar		*s, *endptr;	gint		subdisk;	if (!subdisk_name || !disk_name)		return;	for (list = disk_list; list; list = list->next)		{		disk = (DiskData * ) list->data;		if (!strcmp(subdisk_name, disk->name))			break;		disk = NULL;		}	if (!disk)		{		/* A subdisk name is expected to be the disk_name with a number string		|  appended.  Eg. "hda1" is a subdisk_name of disk_name "hda"		*/		s = subdisk_name + strlen(disk_name);		subdisk = strtol(s, &endptr, 0);		if (!*s || *endptr)			return;		disk = add_subdisk(subdisk_name, disk_name, subdisk);		}	disk_assign_data(disk, rb, wb, FALSE);	}static voidupdate_disk(GkrellmdMonitor *mon, gboolean first_update)	{	GList		*list;	DiskData	*disk = NULL;	gkrellm_sys_disk_read_data();	for (list = disk_list; list; list = list->next)		{		disk = (DiskData * ) list->data;		if (disk->changed)			{			gkrellmd_need_serve(mon);			break;			}		}	}static voidserve_disk_data(GkrellmdMonitor *mon, gboolean first_serve)	{	DiskData	*disk;	GList		*list;	gchar		buf[128];	gkrellmd_set_serve_name(mon, "disk");	for (list = disk_list; list; list = list->next)		{		disk = (DiskData *) list->data;		if (!disk->changed && !first_serve)			continue;		if (!disk->subdisk_parent)			{			if (gkrellmd_check_client_version(mon, 2, 2, 7) && disk->virtual)				snprintf(buf, sizeof(buf), "%s virtual %llu %llu\n",							disk->name, disk->rb, disk->wb);			else				snprintf(buf, sizeof(buf), "%s %llu %llu\n",							disk->name, disk->rb, disk->wb);			}		else if (mon->privat->client->feature_subdisk)			snprintf(buf, sizeof(buf), "%s %s %llu %llu\n",						disk->name, disk->subdisk_parent, disk->rb, disk->wb);		else			continue;		gkrellmd_serve_data(mon, buf);		}	}static voidserve_disk_setup(GkrellmdMonitor *mon)	{	GkrellmdClient	*client = mon->privat->client;	if (units_are_blocks)		gkrellmd_send_to_client(client, "<disk_setup>\nunits_are_blocks\n");	if (gkrellmd_check_client_version(mon, 2,1,3))		client->feature_subdisk = TRUE;	}static GkrellmdMonitor disk_monitor =

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -