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

📄 monitor.c

📁 系统任务管理器
💻 C
📖 第 1 页 / 共 4 页
字号:
	{	if (!gkrellm_sys_battery_init())		return NULL;	return &battery_monitor;	}/* ======================================================= */typedef struct	{	gboolean	changed;	gint		type;	gchar		*path;			/* Pathname to sensor data or device file */	gchar		*id_name;		/* These 4 are unique sensor identification */	gint		id;				/*   of a particular sensor type */	gint		iodev;			/* One or any combination may be used. */	gint		inter;	gchar		*vref;	gchar		*default_label;	gint		group;	gfloat		factor;	gfloat		offset;	gfloat		raw_value;	}	Sensor;static GList	*sensors_list;static gboolean thread_busy,				sensors_need_serve;static gpointerread_sensors(void *data)	{	GList		*list;	Sensor		*sensor;	gfloat		tmp;	gboolean	need_serve = FALSE;	for (list = sensors_list; list; list = list->next)		{		sensor = (Sensor *) list->data;		tmp = sensor->raw_value;		if (sensor->type == SENSOR_TEMPERATURE)			gkrellm_sys_sensors_get_temperature(sensor->path, sensor->id,				sensor->iodev, sensor->inter, &sensor->raw_value);		else if (sensor->type == SENSOR_FAN)			gkrellm_sys_sensors_get_fan(sensor->path, sensor->id,				sensor->iodev, sensor->inter, &sensor->raw_value);		else if (sensor->type == SENSOR_VOLTAGE)			gkrellm_sys_sensors_get_voltage(sensor->path, sensor->id,				sensor->iodev, sensor->inter, &sensor->raw_value);		if (sensor->raw_value != tmp)			{			sensor->changed = TRUE;			need_serve = TRUE;			}		else			sensor->changed = FALSE;		}	thread_busy = FALSE;	sensors_need_serve = need_serve; /* Thread, so set after data collected */	return NULL;	}static voidrun_sensors_thread(void)	{#if GLIB_CHECK_VERSION(2,0,0)	if (thread_busy)		return;	thread_busy = TRUE;	g_thread_create(read_sensors, NULL, FALSE, NULL);#else	read_sensors(NULL);#endif	}voidgkrellm_sensors_update_volt_order_base(void)	{	}voidgkrellm_sensors_set_group(gpointer sr, gint group)	{	Sensor	*sensor = (Sensor *) sr;	if (sensor)		sensor->group = group;	}  /* A sensor within a type is uniquely identified by its id_name.  |  A sysdep interface may additionally use any of the triple integer  |  set (id, iodev, inter) for internal identification.  |  Monitor code here uses path to read the sensor values, but id_name is only  |  passed to the client since that is all that is needed for identification  |  (the client is no longer interfacing to sysdep code).  */gpointergkrellm_sensors_add_sensor(gint type, gchar *sensor_path, gchar *id_name,		gint id, gint iodev, gint inter,		gfloat factor, gfloat offset, gchar *vref, gchar *default_label)	{	Sensor	*sensor;	if (!id_name || !*id_name || type < 0 || type > 2)		return NULL;	sensor = g_new0(Sensor, 1);	sensor->id_name = g_strdup(id_name);	if (sensor_path)		sensor->path = g_strdup(sensor_path);	else		sensor->path = g_strdup(id_name);	sensor->vref = g_strdup(vref ? vref : "NONE");	sensor->default_label = g_strdup(default_label ? default_label : "NONE");	sensor->factor = factor;	sensor->offset = offset;	sensor->type = type;	sensor->id = id;	sensor->iodev = iodev;	sensor->inter = inter;	sensors_list = g_list_append(sensors_list, sensor);	return sensor;	}static voidupdate_sensors(GkrellmdMonitor *mon, gboolean first_update)	{	if (sensors_need_serve)		/* Asynchronously set in thread */		gkrellmd_need_serve(mon);	sensors_need_serve = FALSE;	if (!GK.five_second_tick && !first_update)		return;	if (first_update)		read_sensors(NULL);		/* No thread on first read */	else		run_sensors_thread();	}static voidserve_sensors_data(GkrellmdMonitor *mon, gboolean first_serve)	{	Sensor			*sr;	GList			*list;	gchar			buf[128];	gboolean		sensor_disk_ok;	gkrellmd_set_serve_name(mon, "sensors");	sensor_disk_ok = gkrellmd_check_client_version(mon, 2,2,0);	for (list = sensors_list; list; list = list->next)		{		sr = (Sensor *) list->data;		if (sr->group == SENSOR_GROUP_DISK && !sensor_disk_ok)			continue;		if (sr->changed || first_serve)			{			sprintf(buf, "%d \"%s\" %d %d %d %.2f\n",					sr->type, sr->id_name,					sr->id, sr->iodev, sr->inter, sr->raw_value);			gkrellmd_serve_data(mon, buf);			}		}	}static voidserve_sensors_setup(GkrellmdMonitor *mon)	{	GkrellmdClient	*client = mon->privat->client;	GList			*list;	Sensor			*s;	gchar			buf[256];	gboolean		sensor_disk_ok;	gkrellmd_send_to_client(client, "<sensors_setup>\n");	sensor_disk_ok = gkrellmd_check_client_version(mon, 2,2,0);	for (list = sensors_list; list; list = list->next)		{		s = (Sensor *) list->data;		if (s->group == SENSOR_GROUP_DISK && !sensor_disk_ok)			continue;		if (sensor_disk_ok)			sprintf(buf, "%d \"%s\" %d %d %d %.4f %.4f \"%s\" \"%s\" %d\n",					s->type, s->id_name,					s->id, s->iodev, s->inter,					s->factor, s->offset, s->vref, s->default_label, s->group);		else			sprintf(buf, "%d \"%s\" %d %d %d %.4f %.4f \"%s\" \"%s\"\n",					s->type, s->id_name,					s->id, s->iodev, s->inter,					s->factor, s->offset, s->vref, s->default_label);		gkrellmd_send_to_client(client, buf);		}	}static GkrellmdMonitor sensors_monitor =	{	"sensors",	update_sensors,	serve_sensors_data,	serve_sensors_setup	};static GkrellmdMonitor *init_sensors_monitor(void)	{	if (!gkrellm_sys_sensors_init())		return NULL;	return &sensors_monitor;	}/* ======================================================= */static time_t	base_uptime,				up_seconds;static gulong	up_minutes = -1;voidgkrellm_uptime_set_base_uptime(time_t base)	{	base_uptime = base;	}static voidupdate_uptime(GkrellmdMonitor *mon, gboolean first_update)	{	gint	prev_up;	if (GK.ten_second_tick || up_minutes < 0 || first_update)		{		prev_up = up_minutes;		up_seconds = gkrellm_sys_uptime_read_uptime();		if (up_seconds > 0)			up_minutes = (gint) (up_seconds / 60);		else			up_minutes = (gint)(time(0) - _GK.start_time + base_uptime) / 60;		if (up_minutes != prev_up)			gkrellmd_need_serve(mon);		}	}static voidserve_uptime_data(GkrellmdMonitor *mon, gboolean first_serve)	{	gchar	buf[128];	gkrellmd_set_serve_name(mon, "uptime");	snprintf(buf, sizeof(buf), "%lu\n", (gulong) up_minutes);	gkrellmd_serve_data(mon, buf);	}static GkrellmdMonitor uptime_monitor =	{	"uptime",	update_uptime,	serve_uptime_data,	NULL	};static GkrellmdMonitor *init_uptime_monitor(void)	{	if (!gkrellm_sys_uptime_init())		return NULL;	return &uptime_monitor;	}/* ======================================================= */static voidsend_time(GkrellmdClient *client)	{	struct tm	*t;	gchar		buf[128];	t = &gkrellmd_current_tm;	sprintf(buf, "<time>\n%d %d %d %d %d %d %d %d %d\n",		t->tm_sec, t->tm_min, t->tm_hour,		t->tm_mday, t->tm_mon, t->tm_year,		t->tm_wday, t->tm_yday, t->tm_isdst);	gkrellmd_send_to_client(client, buf);	}/* ======================================================= */voidgkrellmd_plugin_serve_setup(GkrellmdMonitor *mon, gchar *name, gchar *line)	{	GkrellmdClient	*client = mon->privat->client;	gchar			buf[256];	if (!mon || !name || !line)		return;	gkrellmd_send_to_client(client, "<plugin_setup>\n");	snprintf(buf, sizeof(buf), "%s %s\n", name, line);	gkrellmd_send_to_client(client, buf);	}static voidadd_monitor(GkrellmdMonitor *mon)	{	if (!mon)		return;	mon->privat = g_new0(GkrellmdMonitorPrivate, 1);	mon->privat->serve_gstring = g_string_new("");	gkrellmd_monitor_list = g_list_append(gkrellmd_monitor_list, mon);	}voidgkrellmd_load_monitors(void)	{	GList			*list;	GkrellmdMonitor	*mon;	add_monitor(init_sensors_monitor());	add_monitor(init_cpu_monitor());	add_monitor(init_proc_monitor());	add_monitor(init_disk_monitor());	add_monitor(init_net_monitor());	add_monitor(init_inet_monitor());	add_monitor(init_mem_monitor());	add_monitor(init_fs_monitor());	add_monitor(gkrellmd_init_mail_monitor());	add_monitor(init_battery_monitor());	add_monitor(init_uptime_monitor());	list = gkrellmd_plugins_load();	if (_GK.list_plugins)		exit(0);	if (_GK.log_plugins)		printf("%s\n", plugin_install_log ? plugin_install_log :				_("No plugins found\n"));	for (  ; list; list = list->next)		{		mon = (GkrellmdMonitor *) list->data;		mon->privat->serve_gstring = g_string_new("");		mon->privat->is_plugin = TRUE;		gkrellmd_monitor_list = g_list_append(gkrellmd_monitor_list, mon);		}	}voidgkrellmd_need_serve(GkrellmdMonitor *mon)	{	if (mon)		mon->privat->need_serve = TRUE;	}gintgkrellmd_update_monitors(void)	{	GList			*list, *c_list;	GkrellmdMonitor			*mon;	GkrellmdMonitorPrivate	*mp;	GkrellmdClient			*client;	struct tm				*pCur;	static time_t			time_prev;	gchar					buf[64];	static gboolean			first_update = TRUE;	static GString			*serve_gstring;	time(&_GK.time_now);	GK.second_tick = (_GK.time_now == time_prev) ? FALSE : TRUE;	time_prev = _GK.time_now;	if (GK.second_tick)		{		pCur = localtime(&_GK.time_now);		GK.two_second_tick  = ((pCur->tm_sec % 2) == 0) ? TRUE : FALSE;		GK.five_second_tick = ((pCur->tm_sec % 5) == 0) ? TRUE : FALSE;		GK.ten_second_tick  = ((pCur->tm_sec % 10) == 0) ? TRUE : FALSE;		GK.minute_tick = (pCur->tm_min  != gkrellmd_current_tm.tm_min);		gkrellmd_current_tm = *pCur;		}	else		{		GK.two_second_tick = FALSE;		GK.five_second_tick = FALSE;		GK.ten_second_tick = FALSE;		GK.minute_tick = FALSE;		}	for (list = gkrellmd_monitor_list; list; list = list->next)		{		mon = (GkrellmdMonitor *) list->data;		if (mon->update_monitor)			(*(mon->update_monitor))(mon, first_update);		}	++GK.timer_ticks;	if (!serve_gstring)		serve_gstring = g_string_new("");	for (c_list = gkrellmd_client_list; c_list; c_list = c_list->next)		{		client = (GkrellmdClient *) c_list->data;		client->last_client = !c_list->next;		if (!client->served)			gkrellmd_send_to_client(client, "<initial_update>\n");		for (list = gkrellmd_monitor_list; list; list = list->next)			{			mon = (GkrellmdMonitor *) list->data;			mp = mon->privat;			if (!mon->serve_data || (!mp->need_serve && client->served))				continue;			mp->client = client;			mp->serve_name_sent = FALSE;			(*(mon->serve_data))(mon, client->served ? FALSE : TRUE);			if (mp->serve_gstring->len > 0)				{				serve_gstring =					g_string_append(serve_gstring, mp->serve_gstring->str);				mp->serve_gstring = g_string_truncate(mp->serve_gstring, 0);				}			}		gkrellmd_send_to_client(client, serve_gstring->str);		serve_gstring = g_string_truncate(serve_gstring, 0);				if (GK.minute_tick || !client->served)			send_time(client);		else if (GK.second_tick)			{			sprintf(buf, "<.%d>\n", gkrellmd_current_tm.tm_sec);			gkrellmd_send_to_client(client, buf);			}		if (!client->served)			gkrellmd_send_to_client(client, "</initial_update>\n");		client->served = TRUE;		}	for (list = gkrellmd_monitor_list; list; list = list->next)		{		mon = (GkrellmdMonitor *) list->data;		mp = mon->privat;		mp->need_serve = FALSE;		}	for (list = serveflag_done_list; list; list = list->next)		*((gboolean *) list->data) = FALSE;	first_update = FALSE;	return TRUE;	}voidgkrellmd_serve_setup(GkrellmdClient *client)	{	GList			*list;	GkrellmdMonitor	*mon;	struct lconv	*lc;	gchar			buf[32], *s, *name;	gkrellmd_send_to_client(client, "<gkrellmd_setup>\n");	s = g_strdup_printf("<version>\ngkrellmd %d.%d.%d%s\n",				GKRELLMD_VERSION_MAJOR, GKRELLMD_VERSION_MINOR,				GKRELLMD_VERSION_REV, GKRELLMD_EXTRAVERSION);	gkrellmd_send_to_client(client, s);	g_free(s);	lc = localeconv();	sprintf(buf, "%c\n", *lc->decimal_point);	s = g_strconcat("<decimal_point>\n", buf, "\n", NULL);	gkrellmd_send_to_client(client, s);	g_free(s);	for (list = gkrellmd_monitor_list; list; list = list->next)		{		mon = (GkrellmdMonitor *) list->data;		mon->privat->client = client;		if (mon->serve_setup)			(*(mon->serve_setup))(mon);		}	name = gkrellm_sys_get_host_name();	s = g_strconcat("<hostname>\n", name, "\n", NULL);	gkrellmd_send_to_client(client, s);	g_free(s);	name = gkrellm_sys_get_system_name();	s = g_strconcat("<sysname>\n", name, "\n", NULL);	gkrellmd_send_to_client(client, s);	g_free(s);	send_time(client);	gkrellmd_send_to_client(client, "<monitors>\n");	for (list = gkrellmd_monitor_list; list; list = list->next)		{		mon = (GkrellmdMonitor *) list->data;		sprintf(buf, "%s\n", mon->name);		gkrellmd_send_to_client(client, buf);		}	sprintf(buf, "%d\n", _GK.io_timeout);	s = g_strconcat("<io_timeout>\n", buf, "\n", NULL);	gkrellmd_send_to_client(client, s);	g_free(s);	sprintf(buf, "%d\n", _GK.reconnect_timeout);	s = g_strconcat("<reconnect_timeout>\n", buf, "\n", NULL);	gkrellmd_send_to_client(client, s);	g_free(s);	gkrellmd_send_to_client(client, "</gkrellmd_setup>\n");	}voidgkrellmd_client_input_connect(GkrellmdMonitor *mon,			void (*func)(GkrellmdClient *, gchar *))	{	mon->privat->client_input_func = func;	}voidgkrellmd_client_read(gint fd, gint nbytes)	{	GList					*list;	GkrellmdClient			*client = NULL;	GkrellmdMonitor			*mon;	GkrellmdMonitorPrivate	*mp;	gchar					buf[513], *s, *e;	gint					n, buflen;	for (list = gkrellmd_client_list; list; list = list->next)		{		client = (GkrellmdClient *) list->data;		if (client->fd != fd)			continue;		if (!client->input_gstring)			client->input_gstring = g_string_new("");		buflen = sizeof(buf) - 1;		while (nbytes > 0)			{			n = (nbytes > buflen) ? buflen : nbytes;			n = recv(fd, buf, n, 0);			if (n <= 0)				break;			nbytes -= n;			buf[n] = '\0';			client->input_gstring =						g_string_append(client->input_gstring, buf);			}		break;		}	if (!list)		return;	while (gkrellmd_getline_from_gstring(&client->input_gstring,				buf, sizeof(buf) - 1))		{		if (*buf == '<')			{			client->input_func = NULL;			s = buf + 1;			for (list = gkrellmd_monitor_list; list; list = list->next)				{				mon = (GkrellmdMonitor *) list->data;				mp = mon->privat;				n = strlen(mp->serve_name);				e = s + n;				if (*e == '>' && !strncmp(mp->serve_name, s, n))					{					client->input_func = mp->client_input_func;					break;					}				}			}		else if (client->input_func)			(*client->input_func)(client, buf);//		printf("%s: %s", client->hostname, buf);		}	}

⌨️ 快捷键说明

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