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

📄 taskmanager.c

📁 以前做的操作系统的课程设计,内容包括:1)编写一个C程序
💻 C
字号:
#include <stdio.h>#include <gtk/gtk.h>#include<string.h>#include<stdio.h>#include<unistd.h>#include<sys/stat.h>#include<dirent.h>#include<ctype.h>#include <gtk/gtkmain.h>/*buffer_size是自定义的最大的数组长度*/#define buffer_size  126/*全局变量数组*/char  buffer[buffer_size];/*从文件中提取我们需要的信息,如从文件中提取开头几个字母是“system“的一行信息,name 是要提取的字符串的名字,length是字符串的长度,info是要增加的信息,	text是要写入的文本区域*/void line_from_file(char *name,int length,FILE *file,char *info,GtkWidget *text){	/*将需要打印出来的info信息打印到文本区域*/	gtk_text_insert(GTK_WIDGET(text),NULL,NULL,NULL,info,-1);	/*如果长度为0,就直接把文件中的信息打印出来,因为文件中只有一行信息*/     	if(length==0)	{	/*从文件中读取一行信息,长度为buffer_size*/		fgets(buffer,buffer_size,file);		/*将信息写到文本区域*/		gtk_text_insert(GTK_WIDGET(text),NULL,NULL,NULL,buffer,-1);		return;	}	/*每次提取一行信息*/	while(fgets(buffer,buffer_size,file)!=NULL)	{	/*比较传入的名字与提取信息的前length个字母是否是相同的,是的话就是我们要提取的信息*/		if(strncmp(buffer,name,length)==0)		{     /*打印信息*/			gtk_text_insert(GTK_WIDGET(text),NULL,NULL,NULL,buffer,-1);			break;		}	}}/*打印与系统有关的信息*/void print_sys(GtkWidget *text){	FILE *file;	/*要从文件中提取的名字,这里是3个系统信息*/	char name[][15]={		"Linux version",		"model name",		"cpu MHz"};	/*打印一行信息到文本区域"The system infomation\n"*/	gtk_text_insert(GTK_WIDGET(text),NULL,NULL,NULL,"The system infomation\n",-1);	/*打开一个名叫"/proc/version"的文件,以只读方式打开*/	file=fopen("/proc/version","r");	/*提取名为“Linux version“的信息,函数意义见第一个函数*/	line_from_file(name[0],strlen(name[0]),file,"",text);	fclose(file);	/*再打开一个文件,处理方法与上面相同*/	file=fopen("/proc/cpuinfo","r");	line_from_file(name[1],strlen(name[1]),file,"",text);	line_from_file(name[2],strlen(name[2]),file,"",text);	fclose(file);		}/*这是打印与内存有关的信息,方式与上面的一样*/void print_mem(GtkWidget *text){	FILE *file;	char name[][15]={		"MemTotal",      		"MemFree",     		"Buffers",  		"Cached",     		"Active",		"Inactive",		"Dirty"};	int i,length;	/*将文本冻住,外面的用户无法修改*/	gtk_widget_realize (text);	gtk_text_freeze (GTK_WIDGET(text));	/*文本的长度*/	length=gtk_text_get_length(GTK_WIDGET(text));	/*删除文本长度个字符,即将文本清空*/	gtk_text_backward_delete (GTK_WIDGET(text),length);	/*打印信息*/	gtk_text_insert(GTK_WIDGET(text),NULL,NULL,NULL,"The memory infomation\n",-1);	/*提取所有的信息并打印出来*/	file=fopen("/proc/meminfo","r");	for(i=0;i<7;i++)	{	/*strlen()是字符串长度的函数*/		line_from_file(name[i],strlen(name[i]),file,"",text);	}	fclose(file);	gtk_text_thaw(GTK_WIDGET(text));}/*这是从一个文件中提取需要的信息*/void getstatus(char *name,GtkWidget *text){	FILE *stat;	int length,j,i=0;	char str[][6]={	"Name","State","Pid"};	char newline[]="\n";	/*打印一个新行*/	gtk_text_insert(GTK_WIDGET(text),NULL,NULL,NULL,newline,-1);	stat=fopen(name,"r");	while(fgets(buffer,buffer_size,stat)!=NULL)	{			if(strncmp(buffer,str[i],strlen(str[i]))==0)		{			length=strlen(buffer);			/*打印一个信息,不打印末尾的换行符*/			gtk_text_insert(GTK_WIDGET(text),NULL,NULL,NULL,buffer,length-1);						gtk_text_insert(GTK_WIDGET(text),NULL,NULL,NULL,"     ",-1);			i++;		}	}	fclose(stat);}	void print_process(GtkWidget *text){	DIR *dp;	struct dirent *dir;	char dirname[]="/proc";	char filename[6];	char filename2[50];;	char  temp[50];	FILE *wchan;		int i,length;	/*冻住文本区域,与上面的函数一样*/	gtk_widget_realize (text);	gtk_text_freeze (GTK_WIDGET(text));	length=gtk_text_get_length(GTK_WIDGET(text));	gtk_text_backward_delete (GTK_WIDGET(text),length);	dp=opendir(dirname);	/*打开一个文件夹,readdir()读取文件夹*/	while((dir=readdir(dp))!=NULL)	{	/*dir->d_name是文件夹中的文件名字,由于进程的文件夹第一个字母都是数字,测试就可知道是不是进程的文件夹*/		if(isdigit(dir->d_name[0]))		{		/*最后filename2中保存的是'/proc/(进程名,每个文件不同)/status"*/	/*最后temp中保存的是'/proc/(进程名,每个文件不同)/wchan"*/	strcpy(filename,dir->d_name);	strcpy(filename2,"/proc/");	strcat(filename2,filename);	strcpy(temp,filename2);	strcat(temp,"/status");	strcat(filename2,"/wchan");	/*从temp文件中提取信息*/	getstatus(temp,text);		wchan=fopen(filename2,"r");	line_from_file("",0,wchan,"wchan ",text);	fclose(wchan);		}	}	gtk_text_thaw(GTK_WIDGET(text));	closedir(dp);}/*程序退出*/gint delete( GtkWidget *widget,         GtkWidget *event,         gpointer data ){  gtk_main_quit ();  return FALSE;}int main( int argc,      char *argv[] ){	  GtkWidget *window,*scrolled_window ;  GtkWidget *table,*button;  GtkWidget *notebook;  GtkWidget *frame1,*frame2,*frame3;  GtkWidget *text1,*text2,*text3;  GtkWidget *label;  gtk_init (&argc, &argv);	/*建立一个顶极的窗口*/  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);	/*请求窗口需要的大小*/  gtk_widget_set_size_request(window,500,300);	/*将窗口关闭按钮与delete函数联系起来*/  g_signal_connect (G_OBJECT (window), "delete_event",             G_CALLBACK (delete), NULL);	/*窗口的边框长度是0*/  gtk_container_set_border_width (GTK_CONTAINER (window), 10);	/*建立一个表格*/  table = gtk_table_new (3, 5, FALSE);	/*将表格装入窗口*/  gtk_container_add (GTK_CONTAINER (window), table);	/*新建一个笔记本*/  notebook = gtk_notebook_new ();	/*笔记本的标签在上面*/  gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);  gtk_table_attach_defaults (GTK_TABLE (table), notebook, 0, 5, 0, 1);	/*显示笔记本*/  gtk_widget_show (notebook);    /*新建一个边框*/  	frame1 = gtk_frame_new (NULL);	/*将边框加入窗口*/  	gtk_container_set_border_width (GTK_CONTAINER (frame1), 10);	/*设定边框的大小*/  	gtk_widget_set_size_request (frame1, 400, 200);	/*显示边框*/  	gtk_widget_show (frame1);	/*笔记本上一页的标签是"系统"*/  	label = gtk_label_new ("系统");	/*将笔记本连入frame*/  	gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame1, label);	/*新建一个文本区*/	text1=gtk_text_new(NULL, NULL);	/*设置文本区为可以写*/	gtk_text_set_editable(GTK_WIDGET(text1), TRUE);	/*将文本区加入边框*/	gtk_container_add(GTK_CONTAINER(frame1),text1);	/*显示边框*/	gtk_widget_show (text1);	/*将文本区冻住,进行写操作*/	gtk_widget_realize (text1);	gtk_text_freeze (GTK_WIDGET(text1));	print_sys(text1);	gtk_text_thaw(GTK_WIDGET(text1));/*大部分函数与第一个边框相同*/	frame2= gtk_frame_new (NULL);  	gtk_container_set_border_width (GTK_CONTAINER (frame2), 10);  	gtk_widget_set_size_request (frame2, 650, 500);  	gtk_widget_show (frame2);  	label = gtk_label_new ("进程");  	gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame2, label);	/*建立一个可以滚动的窗口,小窗口*/	scrolled_window = gtk_scrolled_window_new (NULL, NULL);	/*窗口的边界长度是0*/	gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 0);	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),                GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);	/*将滚动窗口加入边框frame2*/	gtk_container_add (GTK_CONTAINER(frame2), scrolled_window);	/*显示边框*/	gtk_widget_show (scrolled_window);	text2=gtk_text_new(NULL, NULL);	gtk_text_set_editable(GTK_WIDGET(text2), TRUE);	gtk_container_add(GTK_CONTAINER(scrolled_window),text2);	gtk_widget_show (text2);		/*这个函数每隔0.5秒调用函数print_process一次*/		gtk_timeout_add(500,print_process,text2);	frame3= gtk_frame_new (NULL);  	gtk_container_set_border_width (GTK_CONTAINER (frame3), 10);  	gtk_widget_set_size_request (frame3, 650, 500);  	gtk_widget_show (frame3);  	label = gtk_label_new ("内存");  	gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame3, label);	text3=gtk_text_new(NULL, NULL);	gtk_text_set_editable(GTK_WIDGET(text3), TRUE);	gtk_container_add(GTK_CONTAINER(frame3),text3);	gtk_widget_show (text3);   gtk_timeout_add( 500,print_mem,text3 );   gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), 0);	gtk_widget_show (table);	gtk_widget_show (window);	gtk_main ();	return 0;}

⌨️ 快捷键说明

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