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

📄 linux.c

📁 系统任务管理器
💻 C
📖 第 1 页 / 共 5 页
字号:
			fclose(f);			}		return result;			}	if (interface == HDDTEMP_INTERFACE)		{		gkrellm_sys_sensors_hddtemp_check();		return gkrellm_sys_sensors_hddtemp_get_value(sensor_path, temp);		}	if (interface == MBMON_INTERFACE)		{		gkrellm_sys_sensors_mbmon_check(FALSE);		return gkrellm_sys_sensors_mbmon_get_value(sensor_path, temp);		}	if (interface == NVIDIA_SETTINGS_INTERFACE)		{#if GLIB_CHECK_VERSION(2,0,0)		char *args[] = { "nvidia-settings", "-q", sensor_path, NULL };		char *output = NULL;		result = g_spawn_sync(NULL, args, NULL,					G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL,					NULL, NULL, &output, NULL, NULL, NULL);		if(result && output)			{			gfloat dummy;			if(!temp) temp = &dummy;			result = (sscanf(output, " Attribute %*s %*s %f", temp) == 1);			}		g_free(output);		return result;#else		return FALSE;#endif		}    if (interface == UNINORTH_INTERFACE)        {        if ((f = fopen(sensor_path, "r")))            {            fscanf(f, "%f", temp);            fclose(f);            return TRUE;            }        }	if ((f = fopen(sensor_path, "r")) == NULL)		return FALSE;	fgets(buf, sizeof(buf), f);	fclose(f);	if (!have_sysfs_sensors && need_locale_fix)		locale_fix(buf);	n = sscanf(buf, "%f %f %f %f %f", &t[0], &t[1], &t[2], &t[3], &t[4]);	if (n < 1)		return FALSE;	T = t[n - 1];	if (have_sysfs_sensors)		T /= 1000.0;	else if (T > 254.0)		/* Bogus read from BIOS if CHAR_MAX */		return FALSE;	if (temp)		*temp = T;	return TRUE;	}gbooleangkrellm_sys_sensors_get_fan(gchar *sensor_path, gint id,		gint iodev, gint interface, gfloat *fan)	{	FILE		*f;	gchar		buf[64];	gint		n;	gfloat		t[4], T;	gboolean	result = FALSE;	if (interface == IBM_ACPI_INTERFACE)		{		f = fopen(sensor_path, "r");		if (f) 			{			fgets(buf, sizeof(buf), f);			fgets(buf, sizeof(buf), f);			sscanf(buf, "speed: %f", &T); 			fclose(f);			*fan = T;			result = TRUE;			}		return result;		}	if (interface == MBMON_INTERFACE)		{		gkrellm_sys_sensors_mbmon_check(FALSE);		return gkrellm_sys_sensors_mbmon_get_value(sensor_path, fan);		}	if ((f = fopen(sensor_path, "r")) == NULL)		return FALSE;	fgets(buf, sizeof(buf), f);	fclose(f);	if (!have_sysfs_sensors && need_locale_fix)		locale_fix(buf);	n = sscanf(buf, "%f %f %f %f", &t[0], &t[1], &t[2], &t[3]);	if (n < 1)		return FALSE;	if (fan)		*fan = t[n - 1];	return TRUE;	}gbooleangkrellm_sys_sensors_get_voltage(gchar *sensor_path, gint id,		gint iodev, gint interface, gfloat *volt)	{	FILE	*f;	gchar	buf[64];	gfloat	V, t[3];	gint	n;	if (interface == MBMON_INTERFACE)		{		gkrellm_sys_sensors_mbmon_check(FALSE);		return gkrellm_sys_sensors_mbmon_get_value(sensor_path, volt);		}	if ((f = fopen(sensor_path, "r")) == NULL)		return FALSE;	fgets(buf, sizeof(buf), f);	fclose(f);	if (!have_sysfs_sensors && need_locale_fix)		locale_fix(buf);	n = sscanf(buf, "%f %f %f", &t[0], &t[1], &t[2]);	if (n < 1)		return FALSE;	V = t[n - 1];	if (have_sysfs_sensors)		V /= 1000.0;	else if (V > 254.0)		/* Bogus read from BIOS if CHAR_MAX */		return FALSE;	if (volt)		*volt = V;	return TRUE;	}static voidget_volt_default(gchar *chip_name, VoltDefault **vdf, gint *vdfsize)	{	if (!strncmp(chip_name, "it87", 4))		{		*vdf = &voltdefault8[0];		*vdfsize = sizeof (voltdefault8) / sizeof (VoltDefault);		}	else if (   !strncmp(chip_name, "adm1025", 7)			 || !strncmp(chip_name, "adm9240", 7)			 || !strncmp(chip_name, "lm87", 4)			 || !strncmp(chip_name, "lm81", 4)			 || !strncmp(chip_name, "ds1780", 6)			)		{		*vdf = &voltdefault7[0];		*vdfsize = sizeof (voltdefault7) / sizeof (VoltDefault);		}	else if (!strncmp(chip_name, "mtp008", 6))		{		*vdf = &voltdefault6[0];		*vdfsize = sizeof (voltdefault6) / sizeof (VoltDefault);		}	else if (!strncmp(chip_name, "via686", 6))		{		*vdf = &voltdefault5[0];		*vdfsize = sizeof (voltdefault5) / sizeof (VoltDefault);		}	else if (!strncmp(chip_name, "gl520", 5))		{		*vdf = &voltdefault4[0];		*vdfsize = sizeof (voltdefault4) / sizeof (VoltDefault);		}	else if (!strncmp(chip_name, "gl518", 5))		{		*vdf = &voltdefault3[0];		*vdfsize = sizeof (voltdefault3) / sizeof (VoltDefault);		}	else if (!strncmp(chip_name, "lm80", 4))		{		*vdf = &voltdefault2[0];		*vdfsize = sizeof (voltdefault2) / sizeof (VoltDefault);		}	else if (!strncmp(chip_name, "w83", 3) && strncmp(chip_name, "w83781", 6))		{		*vdf = &voltdefault1[0];		*vdfsize = sizeof (voltdefault1) / sizeof (VoltDefault);		}	else if (!strncmp(chip_name, "fscpos", 6))		{		*vdf = &voltdefault9[0];		*vdfsize = sizeof (voltdefault9) / sizeof (VoltDefault);		}	else		{		*vdf = &voltdefault0[0];		*vdfsize = sizeof (voltdefault0) / sizeof (VoltDefault);		}	}static gchar *sysfs_get_chip_name(gchar *dir)	{	gchar	*name, buf[256], *p, *chip;	FILE 	*f;	name = g_strdup_printf("%s/%s", dir, "name");	f = fopen(name, "r");	g_free(name);	if (!f)		return NULL;	buf[0] = '\0';	fscanf(f, "%255[^\n]", buf);	fclose(f);	if (buf[0] == '\0')		return NULL;	if ((p = strchr(buf, ' ')) != NULL)		/* Remove when 2.6.0 is out */		{									/* "w83627hf chip" -> "w83627hf" */		*p++ = '\0';		if (strcmp(p, "chip") && strcmp(p, "subclient"))			return NULL;		}	chip = g_strdup(buf);	for (p = chip; *p; p++)		*p = tolower(*p);	return chip;	}static voidsysfs_sensors_init(void)	{	GDir			*dir, *chip_dir;	VoltDefault		*voltdefault;	gint			id = 0;	gint			type, voltdefaultsize;	gfloat			factor, offset;	gchar			*name, *bus_name, *default_label, *vref,					*id_name,  *chip_name, *s, *d, *sensor_path;	gchar			path[256], buf[256];	if (!have_sysfs)		return;	if ((dir = g_dir_open(SYSFS_I2C_DIR, 0, NULL)) == NULL)		return;	while ((bus_name = (gchar *) g_dir_read_name(dir)) != NULL)		{		snprintf(path, sizeof(path), "%s/%s", SYSFS_I2C_DIR, bus_name);		if ((chip_dir = g_dir_open(path, 0, NULL)) == NULL)			continue;		if ((chip_name = sysfs_get_chip_name(path)) == NULL)			{			g_dir_close(chip_dir);			continue;			}		have_sysfs_sensors = TRUE;		if (_GK.debug_level & DEBUG_SENSORS)				printf("sysfs sensors dir: %s\n", path);		get_volt_default(chip_name, &voltdefault, &voltdefaultsize);		while ((name = (gchar *) g_dir_read_name(chip_dir)) != NULL)			{			snprintf(buf, sizeof(buf), "%s", name);			if ((s = strstr(buf, "_input")) == NULL || s - buf > 6)				continue;			d = s + 6;		/* Can have xxxN_input, xxx_inputN, or xxx_input */			while (isdigit(*d))				*s++ = *d++;			*s = '\0';			while (isdigit(*(s-1)))				--s;			id = atoi(s);			if (!strncmp(buf, "temp", 4))				type = SENSOR_TEMPERATURE;			else if (!strncmp(buf, "fan", 3))				type = SENSOR_FAN;			else if (!strncmp(buf, "in", 2))				type = SENSOR_VOLTAGE;			else				continue;			factor = 1.0;			offset = 0;			default_label = vref = NULL;			if (type == SENSOR_VOLTAGE)				{				if (id < voltdefaultsize)					{					default_label = voltdefault[id].name;					factor = voltdefault[id].factor;					offset = voltdefault[id].offset;					vref = voltdefault[id].vref;					}				else					default_label =  buf;				}			id_name = g_strdup_printf("%s-%s/%s", chip_name, bus_name, buf);			sensor_path = g_strdup_printf("%s/%s", path, name);			gkrellm_sensors_add_sensor(type, sensor_path, id_name,						id, 0, 0,						factor, offset, vref, default_label);			if (_GK.debug_level & DEBUG_SENSORS)				printf("%s %s %d %d\n",							sensor_path, id_name, id, type);			g_free(id_name);			g_free(sensor_path);			}		g_free(chip_name);		g_dir_close(chip_dir);		}	g_dir_close(dir);	}  /* Eventually, move this function from sensors.c to here where  |  it belongs.  */extern void		gkrellm_sensors_linux_name_fix(gchar *chip_name);  /* lm_sensors can have "-isa-" or "-i2c-" embedded in /proc chip names so  |  they are of form w83627hf-isa-0290.  Sensors from sysfs are derived from  |  a bus directory "0-0290" and "name" file with content like "w83627hf"  |  which leads to chip names like "w83627hf-0-0290" without the i2c or  |  isa.  To have a chance at config compatibility between the two,  |  remove the "i2c" and replace the "isa" with "0" in lm_sensors name  |  when generating the id_name.  I don't want to do any munging on the  |  sysfs names because I can't guess if the lm_sensors names had "i2c" or  |  "isa", and besides, probably sysfs will eventually be more common  |  so I'll just make its names the standard now (gkrellm 2.1.20).  */gbooleangkrellm_sys_sensors_init(void)	{	FILE			*f;	GDir			*dir, *chip_dir;	VoltDefault		*voltdefault;	gint			id = 0;	gint			type, voltdefaultsize;	gfloat			factor, offset;	gchar			*name, *chip_name, *fixed_chip_name, *path, *default_label;	gchar			*vref, *sensor_path, *sensor_name, id_name[128];	struct lconv	*lc;	lc = localeconv();	locale_decimal_point = *lc->decimal_point;	if (locale_decimal_point != '.')		need_locale_fix = TRUE;	if ((dir = g_dir_open(THERMAL_ZONE_DIR, 0, NULL)) != NULL)		{		while ((name = (gchar *) g_dir_read_name(dir)) != NULL)			{			path = g_build_filename(THERMAL_ZONE_DIR, name,						"temperature", NULL);			if (g_file_test(path, G_FILE_TEST_IS_REGULAR))				{				snprintf(id_name, sizeof(id_name), "thermal_zone/%s", name);				gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE,							path, id_name,							id, 0, THERMAL_ZONE_INTERFACE,							1.0, 0.0, NULL, name);				}			g_free(path);			}		g_dir_close(dir);		}	if ((dir = g_dir_open(THERMAL_DIR, 0, NULL)) != NULL)		{		while ((name = (gchar *) g_dir_read_name(dir)) != NULL)			{			path = g_build_filename(THERMAL_DIR, name, "status", NULL);			if (g_file_test(path, G_FILE_TEST_IS_REGULAR))				{				snprintf(id_name, sizeof(id_name), "thermal/%s", name);				gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE,							path, id_name,							id, 0, THERMAL_INTERFACE,							1.0, 0.0, NULL, name);				}			g_free(path);			}		g_dir_close(dir);		}	/* Do intial daemon reads to get sensors loaded into sensors.c	*/	gkrellm_sys_sensors_hddtemp_check();	gkrellm_sys_sensors_mbmon_check(TRUE);	/* 	 * IBM ACPI Temperature Sensors	 */	if ((f = fopen(IBM_ACPI_THERMAL, "r")) != NULL)		{		gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE,				IBM_ACPI_THERMAL, "IBM ACPI CPU",				id, IBM_ACPI_CPU_TEMP, IBM_ACPI_INTERFACE,				1.0, 0.0, NULL, "CPU");			gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE,				IBM_ACPI_THERMAL, "IBM ACPI Mini PCI Module",				id, IBM_ACPI_PCI_TEMP, IBM_ACPI_INTERFACE,				1.0, 0.0, NULL, "PCI");			gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE,				IBM_ACPI_THERMAL, "IBM ACPI HDD",				id, IBM_ACPI_HDD_TEMP, IBM_ACPI_INTERFACE,				1.0, 0.0, NULL, "HDD");			gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE,				IBM_ACPI_THERMAL, "IBM ACPI GPU",				id, IBM_ACPI_GPU_TEMP, IBM_ACPI_INTERFACE,				1.0, 0.0, NULL, "GPU");			gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE,				IBM_ACPI_THERMAL, "IBM ACPI Battery 1",				id, IBM_ACPI_BAT1_TEMP, IBM_ACPI_INTERFACE,				1.0, 0.0, NULL, "BAT1");								gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE,				IBM_ACPI_THERMAL, "IBM ACPI Battery 2",				id, IBM_ACPI_BAT2_TEMP, IBM_ACPI_INTERFACE,				1.0, 0.0, NULL, "BAT2");		fclose(f);		}	/* 	 * IBM ACPI Cooling Fan Sensor	 */	if ((f = fopen(IBM_ACPI_FAN_FILE, "r")) != NULL)		{		gkrellm_sensors_add_sensor(SENSOR_FAN,				IBM_ACPI_FAN_FILE, "IBM ACPI Fan Sensor",				id, IBM_ACPI_FAN, IBM_ACPI_INTERFACE,				1.0, 0.0, NULL, "Fan");		fclose(f);		}		if (gkrellm_sys_sensors_get_temperature("GPUCoreTemp", id, 0,					NVIDIA_SETTINGS_INTERFACE, NULL))		{		gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE,					"GPUCoreTemp", "nVidia GPU Core",					id, 0, NVIDIA_SETTINGS_INTERFACE,					1.0, 0.0, NULL, "GPU C");		}	if (gkrellm_sys_sensors_get_temperature("GPUAmbientTemp", id, 0,				NVIDIA_SETTINGS_INTERFACE, NULL))		{		gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE,					"GPUAmbientTemp", "nVidia GPU Ambient",					id, 0, NVIDIA_SETTINGS_INTERFACE,					1.0, 0.0, NULL, "GPU A");		}    if ((dir = g_dir_open(UNINORTH_DIR, 0, NULL)) != NULL)        {        while (( sensor_name = (gchar *) g_dir_read_name(dir)) != NULL )            {            if (strncmp(sensor_name, "sensor", 6) == 0)                {                sensor_path = g_build_filename(UNINORTH_DIR, sensor_name, NULL);                if (strncmp(sensor_name + 8, "temperature", 11) == 0)                    {                    // linux <= 2.6.12 had [cg]pu_temperature instead of                    // sensor[12]_temperature                                        // TODO: read sensorN_location instead of fixed positions                    if (sensor_name[6] == '1' || (strncmp(sensor_name, "cpu", 3)) == 0)                        gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, sensor_path,                                "cpu topside", id, 0, UNINORTH_INTERFACE,                                1.0, 0.0, NULL, "CPU");                    else if (sensor_name[6] == '2' || (strncmp(sensor_name, "gpu", 3)) == 0)                         gkrellm_sensors_add_sensor(SENSOR_TEMPERATURE, sensor_path,                                "gpu on die", id, 0, UNINORTH_INTERFACE,                                1.0, 0.0, NULL, "GPU");                    }                g_free(sensor_path);                }            }        g_dir_close(dir);        }	if ((dir = g_dir_open(SENSORS_DIR, 0, NULL)) == NULL)		{		sysfs_sensors_init();		return TRUE;		}	while ((chip_name = (gchar *) g_dir_read_name(dir)) != NULL)		{		fixed_chip_name = g_strdup(chip_name);		gkrellm_sensors_linux_name_fix(fixed_chip_name);				path = g_build_filename(SENSORS_DIR, chip_name, NULL);		chip_dir = g_dir_open(path, 0, NULL);		if (!chip_dir)			{			g_free(p

⌨️ 快捷键说明

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