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

📄 dpmd.c

📁 Linux下动态电源管理(Dynamic Power Management)的用户守护进程
💻 C
字号:
#include <ctype.h>#include <dirent.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include "dpmd.h"static struct dpmd_config dpmd_conf;#define DEFAULT_CONFIG_FILE  "/usr/local/etc/dpmd.conf"struct dpmd_programs {	char name[32];	struct dpmd_programs *next;};static struct dpmd_programs *programs;static unsigned int idle_time = 0;static int insert_dpmd_programs(char *progname){	struct dpmd_programs *prev, *prog;	prev = prog = programs;	while (prog) {		prev = prog;		prog = prog->next;	}	prog = (struct dpmd_programs *)malloc(sizeof(*prog));	if (!prog) {		return -1;	}	memset(prog, 0, sizeof(*prog));	memcpy(prog->name, progname, 31);	if (prev)		prev->next = prog;	else		programs = prog;	return 0;}static int free_dpmd_programs(void){	struct dpmd_programs *prog = programs;	while (prog) {		free(prog);		prog = prog->next;	}	programs = 0L;	return 0;}/* * Main routine */int main(int argc, char *argv[]){	int ch, ret;	void *tmp;	char *t_prog;	char *config_file, *policy;	struct dpmd_programs *prog;	config_file = DEFAULT_CONFIG_FILE;	while ((ch = getopt(argc, argv, "f:h")) != -1) {		switch (ch) {		case 'h':			printf("dpmd [-f config_file] [-h]\n");			exit(-1);			break;		case 'f':			config_file = optarg;			break;		default:			break;		}	}	parse_config(config_file, &dpmd_conf);	t_prog = strtok(dpmd_conf.programs,",");	do {		if (t_prog == NULL)			continue;		insert_dpmd_programs(t_prog);	} while ((t_prog = strtok(NULL,",")) != NULL);	// Loop	while (1) {		ret = get_running_programs();		/* check for programs */		prog = programs;		while (prog) {			if ((ret = find_program(prog->name))) {				policy = dpmd_conf.policy_high;				idle_time = 0;				break;			}			prog = prog->next;		}		/* check for cpu usage */		get_cpu();		cpu_parse(dpmd_conf.cpu_interval, &tmp);		ret = cpu_evaluate(tmp);		if (ret) {			policy = dpmd_conf.policy_low;			idle_time += dpmd_conf.poll_interval;		}		else {			policy = dpmd_conf.policy_high;			idle_time = 0;		}		/* apply the policy */		dpmd_set_policy(policy);		if (idle_time >= (dpmd_conf.suspend_interval + dpmd_conf.poll_interval)) {			idle_time = 0;//			dpmd_suspend(); /* suspend the system */		}		/* wait for poll_interval seconds */		sleep(dpmd_conf.poll_interval);	}	free_dpmd_programs();	return 0;}

⌨️ 快捷键说明

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