📄 taskmanager.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 + -