源程序附最后(也可直接打包下载http://download.csdn.net/detail/creazyapple/4088149)
要求:
理解和分析/proc文件
内容
了解/proc文件的特点和使用方法。
监控系统状态,显示系统中若干部件的使用情况。
用图形界面显示系统监控状态。
相关原理:
用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
我们要显示系统信息,只需进行相应的文件操作。首先打开相应的文件,读取所需要的信息,将其写入一个缓冲区中,然后将缓冲区的内容加到Gtk的相应的控件上面去,最后将控件组合显示即可。
/proc/文件结构参考:http://blog.csdn.net/ubuntulover/article/details/4449787
比如我们如果要读取cpu信息,可以在控制台下输入命令:cat /proc/cpuinf
要得到内存信息,可以输入命令:cat /proc/meminfo
这只是冰山一角,仅此我们已经看到/proc目录下文件内容之丰富。
要想编程读取这些信息,首先我们要了解/proc结构,了解其各种信息的排布,然后就像读普通文件一样将其筛选出来。
比如,查看系统的cpu频率,属于cpu信息:more /proc/cpuinfo (注,命令more 和cat功能相似,都是显示一个文件的内容)
其排布为如下:
我们也就知道,cpuinf文件中,一种信息放一行,因此我们一行一行的遴选信息。
首先需将cpuinf文件读出来,
fp = fopen("/proc/cpuinf", "r"); /* 从fp中读取sizeof(buffer)块数据放入buffer */ buf = fread(buffer, 1, sizeof(buffer), fp); fclose(fp);
然后进行字符串匹配,找到含有“cpu MHz”这个字符串的一行,读出来即可。
其它如模块信息、内存信息,类似处理,字要你了解了其结构,就可以方便的读出来
所以关键有3点:1、你知道信息在哪里;2、你看到了信息的排列方式;3、设计算法剔除无用信息。
而对于进程信息,稍复杂。
我们先看看进程信息放在哪里的:首先进入 /proc 目录并查看该目录下的文件:
蓝色的是目录(所谓的文件夹),绿色的是文件,文件中有cpuinf、meminfo等,我们之前已经看过。现在看看那些蓝色的以数字为名的文件夹,他们正是保存进程信息的!
目录1存储的是PID为1的进程的信息,目录2存储的是PID为2的进程的信息……
我们试着进入这些目录看看!
里面有一些目录和文件,其中有个status文件,打开看看:
看到了吧,很清晰地罗列出了进程1的信息,名字是init,状态Sleeping ,PID是1……
由此得知,要读取所有进程的信息列表,我们需要循环打开/proc文件夹下所有以数字命名的目录。
大致过程为:
while ((ptr = readdir(dir)) != NULL) { if ((ptr->d_name[0] >= '0') && (ptr->d_name[0] <= '9')) //打开以数值命名的目录 { sprintf(path, "/proc/%s/status", ptr->d_name); //将此文件的全部路径写入name中 //打开这个文件,并且从中读取到有用的信息放在相应的数组中 fd = open(path, O_RDONLY); read(fd, store, sizeof(store)); …… 读取信息 …… close(fd); } } closedir(dir);
好了,现在弄清楚了原理,就可以动手实现了。但是需要一个界面呀,这里我们继续用GTK来画界面。
关于GTK这里就不多说了。
最后实现界面截图:
刷新列表:
最后,附上源程序。共11个文件,将其放入一个文件夹下,编译命令:gcc -o sb *.c `pkg-config --cflags --libs gtk+-2.0`(当然首先得配置好了GTK,
参考上一篇博客 ubuntu GTK+eclipse 配置 http://blog.csdn.net/creazyapple/article/details/7290443)
/* * MainWin.c * SystemMonitor * Created on: 2012-2-24 * Author: zhushengben */ #include
/* * cpu.h * helloWorld * Created on: 2012-2-19 * Author: zhushengben */ #ifndef CPU_H_ #define CPU_H_ GtkWidget *window; GtkWidget *main_vbox; GtkWidget *clist; //进程时候需要的列表 GtkWidget *clist2; //模块读取时需要的列表 GtkWidget *cpu_draw_area; GdkPixmap *cpu_graph; GtkWidget *pbar_cpu; /* 全局变量 */ static gint cpuPoints[100]; static gfloat cpu_rate = 0.0; static char PID[20]; static int selectedRow; float zuser = 0, ztotal = 0; typedef struct CPUinfo { char modeName[50]; //line 5 char cpuMHz[10]; //line 7 char cacheSize[10];//line 8 char cpuCores[10]; //line 12 char addrSize[50]; //line 30 }*cpuInfo; static gboolean cpu_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data) { gdk_draw_drawable(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE( widget)], cpu_graph, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE; } static gboolean cpu_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { if (cpu_graph) { g_object_unref(cpu_graph); } cpu_graph = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); gdk_draw_rectangle(cpu_graph, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); return TRUE; } /* 取得cpu利用率 */ float getCpuUseRatio() { FILE *fp; char buffer[1024]; size_t buf; float useRatio; /* 分别为用户模式,低优先级用户模式,内核模式,空闲的处理器时间 */ float user = 0, nice = 0, sys = 0, idle = 0, iowait = 0; fp = fopen("/proc/stat", "r"); /* 从fp中读取sizeof(buffer)块数据放入buffer,每次读一块 */ buf = fread(buffer, 1, sizeof(buffer), fp); fclose(fp); if (buf == 0) return 0; buffer[buf] == '\0'; sscanf(buffer, "cpu %f %f %f %f %f", &user, &nice, &sys, &idle, &iowait); if (idle <= 0) idle = 0; useRatio = 100 * (user - zuser) / (user + nice + sys + idle - ztotal); if (useRatio > 100) useRatio = 100; ztotal = user + nice + sys + idle; zuser = user; cpu_rate = useRatio; return useRatio; } /* cpu标签页,显示cpu信息 */ void createCPUPage(GtkWidget* notebook) { GtkWidget *label; GtkWidget *vbox; GtkWidget *frame1 = gtk_frame_new(""); gtk_container_set_border_width(GTK_CONTAINER(frame1), 10); gtk_widget_set_size_request(frame1, 120, 500); gtk_widget_show(frame1); /* 将该标签页加入到notebook中 */ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame1, gtk_label_new( "CPU信息")); /* 在该页建议个表格,分为上下2行,一列 */ GtkWidget *table1 = gtk_table_new(10, 10, TRUE); /* 将这个表添加到“cpu使用率“页 */ gtk_container_add(GTK_CONTAINER(frame1), table1); /* 新建一个frame框架用于显示图表 */ GtkWidget *CPU_frame1 = gtk_frame_new("CPU使用历史曲线"); /* 放到表格第一行 */ /* 这个函数的参数不懂,不好调整 */ gtk_table_attach_defaults(GTK_TABLE(table1), CPU_frame1, 0, 8, 0, 5); gtk_widget_show(CPU_frame1); /* 现在,我们开始向屏幕绘图。 * 我们使用的构件是绘图区构件。 *一个绘图区构件本质上是一个 X 窗口,没有其它的东西。 *它是一个空白的画布,我们可以在其上绘制需要的东西。*/ cpu_draw_area = gtk_drawing_area_new(); /* 设置可以画图 */ gtk_widget_set_app_paintable(cpu_draw_area, TRUE); /* 画图区默认大小 */ gtk_drawing_area_size(GTK_DRAWING_AREA(cpu_draw_area), 40, 80); /* 画布添加到cpu曲线框架中 */ gtk_container_add(GTK_CONTAINER(CPU_frame1), cpu_draw_area); gtk_widget_show(cpu_draw_area); /* 关联回调函数 */ /* 关于各种事件不甚了解 */ g_signal_connect(cpu_draw_area, "expose_event", G_CALLBACK(cpu_expose_event), NULL); g_signal_connect(cpu_draw_area, "configure_event", G_CALLBACK( cpu_configure_event), NULL); gtk_widget_show(cpu_draw_area); int i; for (i = 0; i < 100; i++) { /* 要取[a,b)之间的随机整数(包括a,但不包括b),使用: * (rand() % (b - a)) + a */ cpuPoints[i] = (rand() % 30 + 180); } // 此处出现问题 /* 不断刷新画图 */ // gtk_timeout_add(100, (GtkFunction) drawGraph, NULL); /* 取得CPU信息 */ char modeName[50], cpuMHz[20], cacheSize[20], cpuCores[20], addrSize[50]; char cpuBuffer[1000]; //getCPUInfo("/proc/cpuinfo", modeName, cacheSize); //cpuMHz,cacheSize,cpuCores,addrSize); /* 不能用\t !! */ getInforNotd("/proc/cpuinfo", "model name", modeName); getInforNotd("/proc/cpuinfo", "cache size", cacheSize); getInforNotd("/proc/cpuinfo", "cpu MHz", cpuMHz); getInforNotd("/proc/cpuinfo", "cpu cores", cpuCores); getInforNotd("/proc/cpuinfo", "address sizes", addrSize); /* 建一个frame在表一下半部显示cpu信息 */ GtkWidget *frame_down = gtk_frame_new("系统信息 "); gtk_table_attach_defaults(GTK_TABLE(table1), frame_down, 0, 10, 5, 10); gtk_widget_show(frame_down); /* 这里必须要show表,为什么?不知到该在什么时候show什么 */ gtk_widget_show(table1); /* 在该狂建建一个表格,将下半部分为1行,2列 */ GtkWidget *table_down = gtk_table_new(1, 2, TRUE); /* 将这个表添加到下面框架 */ gtk_container_add(GTK_CONTAINER(frame_down), table_down); /* 建一个frame在表二左半部显示硬件信息 */ GtkWidget *frame_left_down = gtk_frame_new("硬件"); gtk_table_attach_defaults(GTK_TABLE(table_down), frame_left_down, 0, 1, 0, 1); gtk_widget_show(frame_left_down); /* 这里必须要show表,为什么?不知到该在什么时候show什么 */ gtk_widget_show(table_down); /* 容器 */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_container_add(GTK_CONTAINER(frame_left_down), vbox); gtk_widget_show(vbox); /* 建一个标签显示cpu型号 */ strcpy(cpuBuffer, "CPU型号和主频:\n"); strcat(cpuBuffer, modeName); /* 这里不该有? * gtk_widget_show(label); * 原来是因为我们有清除cpuBuffer */ /* 建一个标签显示cache大小 */ strcat(cpuBuffer, "\n\nCache 大小:"); strcat(cpuBuffer, cacheSize); /* 建一个标签显示cpu主频 */ strcat(cpuBuffer, "\n\ncpu 主频:"); strcat(cpuBuffer, cpuMHz); strcat(cpuBuffer, " MHz"); /* 建一个标签显示cpu核数 */ strcat(cpuBuffer, "\n\ncpu核数:"); strcat(cpuBuffer, cpuCores); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5); /* 建一个标签显示addrSize */ strcat(cpuBuffer, "\n\n寻址位数:"); strcat(cpuBuffer, addrSize); label = gtk_label_new(cpuBuffer); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5); gtk_widget_show(label); /* 建一个frame在表二右半部显示系统版本信号 */ GtkWidget *frame_right_down = gtk_frame_new("Ubuntu"); GdkColor color; PangoFontDescription *font; /* 设置颜色 */ gdk_color_parse("blue", &color); gtk_widget_modify_fg(frame_right_down, GTK_STATE_NORMAL, &color); /* 设置字体 */ font = pango_font_description_from_string("San"); pango_font_description_set_size(font, 30 * PANGO_SCALE); gtk_widget_modify_font(frame_right_down, font); gtk_table_attach_defaults(GTK_TABLE(table_down), frame_right_down, 1, 2, 0, 1); gtk_widget_show(frame_right_down); /* 这里必须要show表,为什么?不知到该在什么时候show什么 */ gtk_widget_show(table_down); /* 容器 */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_container_add(GTK_CONTAINER(frame_right_down), vbox); gtk_widget_show(vbox); /* 建一个标签显示cpu型号 */ memset(cpuBuffer, 0, 1000); memset(addrSize, 0, 50); getSysVersion("/proc/version", "version", addrSize); strcat(cpuBuffer, "\n\n内核版本 : "); strcat(cpuBuffer, addrSize); strcat(cpuBuffer, "\n\n系统版本 10.10 (maverick)"); strcat(cpuBuffer, "\n\nGNOME 2.32.0"); GtkWidget *label1 = gtk_label_new(cpuBuffer); gtk_box_pack_start(GTK_BOX(vbox), label1, FALSE, FALSE, 5); gtk_widget_show(label1); /* 新建一个frame框架用于显示进度条*/ GtkWidget *frame_cpu = gtk_frame_new("cpu使用率"); gtk_table_attach_defaults(GTK_TABLE(table1), frame_cpu, 8, 10, 0, 5); gtk_widget_show(frame_cpu); /* 创建第一个进度条 * GTK_PROGRESS_BOTTOM_TO_TOP */ pbar_cpu = gtk_progress_bar_new(); gtk_container_add(GTK_CONTAINER(frame_cpu), pbar_cpu); gtk_progress_bar_set_orientation(pbar_cpu, GTK_PROGRESS_BOTTOM_TO_TOP); gtk_widget_show(pbar_cpu); /* 容器 放在右下角 */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_table_attach_defaults(GTK_TABLE(table1), vbox, 6, 10, 7, 10); gtk_widget_show(vbox); gtk_widget_show(table1); /* 创建一个图像 */ GtkWidget *image = gtk_image_new_from_file("4.png"); gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 3); gtk_widget_show(image); /* 容器 放在右下角 */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_table_attach_defaults(GTK_TABLE(table1), vbox, 0, 5, 7, 10); gtk_widget_show(vbox); gtk_widget_show(table1); /* 创建一个图像 */ image = gtk_image_new_from_file("1.png"); gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 3); gtk_widget_show(image); } #endif /* CPU_H_ */
/* * memory.h * systemMonitor * Created on: 2012-2-19 * Author: zhushengben */ #ifndef MEMORY_H_ #define MEMORY_H_ typedef struct _ProgressData { GtkWidget *frame1; GtkWidget *pbar; GtkWidget *pbar1; GtkWidget *pbar2; GtkWidget *pbar3; gboolean activity_mode; } ProgressData; ProgressData *pdata_mem; GtkWidget *label_memSize; GtkWidget *label_freeSize; GtkWidget *label_cacheSize; GtkWidget *label_cacheUse; gdouble memUseRatio, swapUse; char totalMem[20], freeMem[20], SwapTotal[20], SwapFree[20]; char Buffers[20], Cached[20], buffer[40]; /* 更新进度条,这样就能够看到进度条的移动 */ gint progress_timeout(gpointer data); /* MEMERY标签页,显示内存信息 */ void createMemPage(GtkWidget* notebook) { GtkWidget *align; GtkWidget *table; GtkWidget *vbox; GtkWidget *image; GdkColor color; PangoFontDescription *font; memUseRatio = 0; memset(buffer, 0, 40); /* 为传递到回调函数中的数据分配内存 */ pdata_mem = g_malloc(sizeof(ProgressData)); pdata_mem->frame1 = gtk_frame_new(""); gtk_container_set_border_width(GTK_CONTAINER(pdata_mem->frame1), 0); gtk_widget_set_size_request(pdata_mem->frame1, 120, 500); gtk_widget_show(pdata_mem->frame1); /* 将该标签页加入到notebook中 */ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pdata_mem->frame1, gtk_label_new("内存信息")); /* 建一个表格,将下半部分为10行,10列 */ table = gtk_table_new(10, 10, TRUE); /* 将这个表添加到框架 */ gtk_container_add(GTK_CONTAINER(pdata_mem->frame1), table); /* 创建进度条 */ /* 新建一个frame框架用于显示进度条*/ GtkWidget *frame_cpu = gtk_frame_new("内存"); gtk_table_attach_defaults(GTK_TABLE(table), frame_cpu, 0, 5, 0, 3); gtk_widget_show(frame_cpu); /* 容器 */ vbox = gtk_vbox_new(FALSE, 2); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_container_add(GTK_CONTAINER(frame_cpu), vbox); gtk_widget_show(vbox); gtk_widget_show(table); /* 创建一个居中对齐的对象 */ align = gtk_alignment_new(0.5, 0.5, 0.8, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 5); gtk_widget_show(align); /* 创建第一个进度条 * GTK_PROGRESS_BOTTOM_TO_TOP */ pdata_mem->pbar = gtk_progress_bar_new(); gtk_container_add(GTK_CONTAINER(align), pdata_mem->pbar); gtk_progress_bar_set_orientation(pdata_mem->pbar, GTK_PROGRESS_LEFT_TO_RIGHT); gtk_widget_show(pdata_mem->pbar); /* 创建一个居中对齐的对象 */ align = gtk_alignment_new(0.5, 0.5, 0.8, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 5); gtk_widget_show(align); /* 创建第二个进度条 */ pdata_mem->pbar1 = gtk_progress_bar_new(); gtk_container_add(GTK_CONTAINER(align), pdata_mem->pbar1); // toggle_show_text("内存使用率", pdata_mem); toggle_activity_mode(FALSE, pdata_mem); gtk_widget_show(pdata_mem->pbar1); /* 新建一个frame框架用于显示进度条*/ frame_cpu = gtk_frame_new("交换区"); gtk_table_attach_defaults(GTK_TABLE(table), frame_cpu, 5, 10, 0, 3); gtk_widget_show(frame_cpu); vbox = gtk_vbox_new(FALSE, 2); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_container_add(GTK_CONTAINER(frame_cpu), vbox); gtk_widget_show(vbox); gtk_widget_show(table); /* 创建一个居中对齐的对象 */ align = gtk_alignment_new(0.5, 0.5, 0.8, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 5); gtk_widget_show(align); /* 创建第三个进度条 */ pdata_mem->pbar2 = gtk_progress_bar_new(); gtk_container_add(GTK_CONTAINER(align), pdata_mem->pbar2); toggle_show_text("内存交换区", pdata_mem); toggle_activity_mode(FALSE, pdata_mem); gtk_widget_show(pdata_mem->pbar2); /* 创建一个居中对齐的对象 */ align = gtk_alignment_new(0.5, 0.5, 0.8, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 5); gtk_widget_show(align); /* 创建第四个进度条 */ pdata_mem->pbar3 = gtk_progress_bar_new(); gtk_container_add(GTK_CONTAINER(align), pdata_mem->pbar3); toggle_show_text("交换区使用量", pdata_mem); toggle_activity_mode(FALSE, pdata_mem); gtk_widget_show(pdata_mem->pbar3); /* 加上这一行后,出现问题 * faile to NULL to ProgressBar * 关于timer的使用不明白 */ /* 不断刷新画图 */ //gtk_timeout_add(100, (GtkFunction) progress_timeout, pdata_mem); progress_timeout(pdata_mem); /*************************************/ /* 容器 放在左下角 */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_table_attach_defaults(GTK_TABLE(table), vbox, 0, 6, 4, 10); gtk_widget_show(vbox); gtk_widget_show(table); /* 创建一个居中对齐的对象 */ align = gtk_alignment_new(0.5, 0.5, 0, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 5); gtk_widget_show(align); /* 建一个标签显示内存大小 */ label_memSize = gtk_label_new(buffer); gtk_container_add(GTK_CONTAINER(align), label_memSize); font = pango_font_description_from_string("San"); pango_font_description_set_size(font, 15 * PANGO_SCALE); gtk_widget_modify_font(label_memSize, font); /* 设置控件可容字数从而设置其大小 */ gtk_label_set_width_chars(GTK_LABEL(label_memSize), 20); /* 设置控件对齐方式 * 第一个参数是lblTest,第二个参数是左右方向的对齐值,第三个参数是上下方向的对齐值; *对齐值的取值范围为0-1.取0时,为左对齐,取1时,为右对齐,取0.5时,为中间对齐. */ gtk_misc_set_alignment(GTK_MISC(label_memSize), 0, 0.5); gtk_widget_show(label_memSize); /****************************************************/ /* 创建一个居中对齐的对象 */ align = gtk_alignment_new(0.5, 0.5, 0, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 5); gtk_widget_show(align); /* 建一个标签显示空闲区大小 */ label_freeSize = gtk_label_new(buffer); gtk_container_add(GTK_CONTAINER(align), label_freeSize); /* 设置颜色 */ gdk_color_parse("red", &color); gtk_widget_modify_fg(label_freeSize, GTK_STATE_NORMAL, &color); /* 设置字体 */ font = pango_font_description_from_string("San"); pango_font_description_set_size(font, 15 * PANGO_SCALE); gtk_widget_modify_font(label_freeSize, font); /* 设置控件可容字数从而设置其大小 */ gtk_label_set_width_chars(GTK_LABEL(label_freeSize), 20); /* 设置控件对齐方式 * 第一个参数是lblTest,第二个参数是左右方向的对齐值,第三个参数是上下方向的对齐值; *对齐值的取值范围为0-1.取0时,为左对齐,取1时,为右对齐,取0.5时,为中间对齐. */ gtk_misc_set_alignment(GTK_MISC(label_freeSize), 0, 0.5); gtk_widget_show(label_freeSize); /****************************************************/ /* 创建一个居中对齐的对象 */ align = gtk_alignment_new(0.5, 0.5, 0, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 5); gtk_widget_show(align); /* 建一个标签显示cache大小 */ label_cacheSize = gtk_label_new(buffer); gtk_container_add(GTK_CONTAINER(align), label_cacheSize); /* 设置颜色 */ gdk_color_parse("black", &color); gtk_widget_modify_fg(label_cacheSize, GTK_STATE_NORMAL, &color); /* 设置字体 */ font = pango_font_description_from_string("San"); pango_font_description_set_size(font, 15 * PANGO_SCALE); gtk_widget_modify_font(label_cacheSize, font); /* 设置控件可容字数从而设置其大小 */ gtk_label_set_width_chars(GTK_LABEL(label_cacheSize), 20); /* 设置控件对齐方式 * 第一个参数是lblTest,第二个参数是左右方向的对齐值,第三个参数是上下方向的对齐值; *对齐值的取值范围为0-1.取0时,为左对齐,取1时,为右对齐,取0.5时,为中间对齐. */ gtk_misc_set_alignment(GTK_MISC(label_cacheSize), 0, 0.5); gtk_widget_show(label_cacheSize); /****************************************************/ /* 创建一个居中对齐的对象 */ align = gtk_alignment_new(0.5, 0.5, 0, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 5); gtk_widget_show(align); /* 建一个标签显示空闲区大小 */ label_cacheUse = gtk_label_new(buffer); gtk_container_add(GTK_CONTAINER(align), label_cacheUse); /* 设置颜色 */ gdk_color_parse("black", &color); gtk_widget_modify_fg(label_cacheUse, GTK_STATE_NORMAL, &color); /* 设置字体 */ font = pango_font_description_from_string("San"); pango_font_description_set_size(font, 15 * PANGO_SCALE); gtk_widget_modify_font(label_cacheUse, font); /* 设置控件可容字数从而设置其大小 */ gtk_label_set_width_chars(GTK_LABEL(label_cacheUse), 20); /* 设置控件对齐方式 * 第一个参数是lblTest,第二个参数是左右方向的对齐值,第三个参数是上下方向的对齐值; *对齐值的取值范围为0-1.取0时,为左对齐,取1时,为右对齐,取0.5时,为中间对齐. */ gtk_misc_set_alignment(GTK_MISC(label_cacheUse), 0, 0.5); gtk_widget_show(label_cacheUse); /**********************************************/ /* 容器 放在中间角角 */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_table_attach_defaults(GTK_TABLE(table), vbox, 0, 10, 3, 8); gtk_widget_show(vbox); gtk_widget_show(table); /* 新建一个frame框架用于显示进度条*/ frame_cpu = gtk_frame_new(""); gtk_table_attach_defaults(GTK_TABLE(table), frame_cpu, 0, 10, 3, 4); gtk_widget_show(frame_cpu); /* 创建一个进度条 */ createProgressBar(frame_cpu); /* 容器 放在右下角 */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_table_attach_defaults(GTK_TABLE(table), vbox, 4, 10, 5, 10); gtk_widget_show(vbox); gtk_widget_show(table); /* 创建一个图像 */ image = gtk_image_new_from_file("penguin.gif"); gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 3); gtk_widget_show(image); /* 容器 放在右下角 */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_table_attach_defaults(GTK_TABLE(table), vbox, 3, 7, 8, 10); gtk_widget_show(vbox); gtk_widget_show(table); /* 创建一个图像 */ image = gtk_image_new_from_file("5.png"); gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 3); gtk_widget_show(image); /* 容器 放在右下角 */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_table_attach_defaults(GTK_TABLE(table), vbox, 0, 2, 4, 6); gtk_widget_show(vbox); gtk_widget_show(table); /* 创建一个图像 */ image = gtk_image_new_from_file("a.png"); gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 3); gtk_widget_show(image); } /* 更新进度条,这样就能够看到进度条的移动 */ gint progress_timeout(gpointer data) { if (pdata_mem->activity_mode) gtk_progress_bar_pulse(GTK_PROGRESS_BAR(pdata_mem->pbar)); else { gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pdata_mem->pbar), memUseRatio); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pdata_mem->pbar1), 1 - memUseRatio); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pdata_mem->pbar2), swapUse); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pdata_mem->pbar3), 1 - swapUse); } return TRUE; } /* 设置进度条的滑槽上的文本显示 */ void toggle_show_text(const gchar *text, ProgressData *pdata_mem) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pdata_mem->pbar), "内存使用率"); } /* 设置进度条的活动模式 */ void toggle_activity_mode(gboolean activity_mode, ProgressData *pdata_mem) { pdata_mem->activity_mode = activity_mode; } /* 回调函数,切换进度条的移动方向 */ void toggle_orientation(GtkWidget *widget, ProgressData *pdata_mem) { switch (gtk_progress_bar_get_orientation(GTK_PROGRESS_BAR(pdata_mem->pbar))) { case GTK_PROGRESS_LEFT_TO_RIGHT: gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(pdata_mem->pbar), GTK_PROGRESS_RIGHT_TO_LEFT); break; case GTK_PROGRESS_RIGHT_TO_LEFT: gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(pdata_mem->pbar), GTK_PROGRESS_LEFT_TO_RIGHT); break; default: ;// 什么也不做 } } /* 清除分配的内存,删除定时器(timer) */ void destroy_progress(GtkWidget *widget, ProgressData *pdata_mem) { pdata_mem->frame1 = NULL; pdata_mem->pbar = NULL; pdata_mem->pbar1 = NULL; pdata_mem->pbar2 = NULL; pdata_mem->pbar3 = NULL; g_free(pdata_mem); gtk_main_quit(); } void set_label_mem_text(void) { getInfor("/proc/meminfo", "MemTotal", totalMem); getInfor("/proc/meminfo", "MemFree", freeMem); getInfor("/proc/meminfo", "SwapTotal", SwapTotal); getInfor("/proc/meminfo", "SwapFree", SwapFree); float total_mem = (float) atoi(totalMem); float free_mem = (float) atoi(freeMem); memUseRatio = 1 - free_mem / total_mem; float total_swap = (float) atoi(SwapTotal); float free_swap = (float) atoi(SwapFree); swapUse = 1 - free_swap / total_swap; gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pdata_mem->pbar), memUseRatio); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pdata_mem->pbar1), 1 - memUseRatio); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pdata_mem->pbar2), swapUse); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pdata_mem->pbar3), 1 - swapUse); char p[20] = "内存使用率(", buf[10]; gcvt(memUseRatio * 100, 4, buf); strcat(buf, "%)"); strcat(p, buf); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pdata_mem->pbar), p); char p1[20] = "内存剩余量(", buf1[10]; gcvt(100 - memUseRatio * 100, 4, buf1); strcat(buf1, "%)"); strcat(p1, buf1); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pdata_mem->pbar1), p1); char p2[20] = "交换区使用率(", buf2[10]; gcvt(swapUse * 100, 4, buf2); strcat(buf2, "%)"); strcat(p2, buf2); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pdata_mem->pbar2), p2); char p3[20] = "交换区剩余量(", buf3[10]; gcvt(100 - swapUse * 100, 4, buf3); strcat(buf3, "%)"); strcat(p3, buf3); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pdata_mem->pbar3), p3); char buffer[100] = ""; strcat(buffer, "\n\n内存大小 : "); strcat(buffer, totalMem); strcat(buffer, " MB"); gtk_label_set_text((GtkLabel*) label_memSize, buffer); memset(buffer, 0, 40); strcat(buffer, "\n空闲区大小 : "); strcat(buffer, freeMem); strcat(buffer, " MB"); gtk_label_set_text((GtkLabel*) label_freeSize, buffer); getInfor("/proc/meminfo", "Buffers", Buffers); memset(buffer, 0, 40); strcat(buffer, "\n缓存大小 : "); strcat(buffer, Buffers); strcat(buffer, " MB"); gtk_label_set_text((GtkLabel*) label_cacheSize, buffer); getInfor("/proc/meminfo", "Cached", Cached); memset(buffer, 0, 40); strcat(buffer, "\nCached大小 : "); strcat(buffer, Cached); strcat(buffer, " MB"); gtk_label_set_text((GtkLabel*) label_cacheUse, buffer); } #endif /* MEMORY_H_ */
/* * module.h * helloWorld * Created on: 2012-2-19 * Author: zhushengben */ #ifndef MODULE_H_ #define MODULE_H_ GtkWidget * clist_modul; void getModInfo(char store[], int i, char modName[], char memUse[], char times[]); void createModPage(GtkWidget* notebook) { GtkWidget *frame_up, *frame_down, *table, *align, *button; GtkWidget *frame = gtk_frame_new("模块信息表"); gtk_container_set_border_width(GTK_CONTAINER(frame), 10); gtk_widget_set_size_request(frame, 100, 355); gtk_widget_show(frame); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, gtk_label_new( "模块信息")); /* 建一个表格,分为上下两部分 */ table = gtk_table_new(10, 4, TRUE); /* 将这个表添加到框架 */ gtk_container_add(GTK_CONTAINER(frame), table); /* 建一个frame在表上边*/ frame_down = gtk_frame_new("*0(^_^)0*"); gtk_table_attach_defaults(GTK_TABLE(table), frame_down, 0, 4, 0, 10); gtk_widget_show(frame_down); gtk_widget_show(table); GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(frame_down), scrolled_window); gtk_widget_show(scrolled_window); /* 老是不能显示,经测试直到这里都可以正确实现 */ gchar *titles[3] = { "模块名", "占用内存", "加载次数" }; //由于含有特殊情况,所以只读取通//用格式的范例 clist_modul = gtk_clist_new_with_titles(3, titles); gtk_clist_set_shadow_type(GTK_CLIST(clist_modul), GTK_SHADOW_IN); gtk_clist_set_column_width(GTK_CLIST(clist_modul), 0, 270); gtk_clist_set_column_width(GTK_CLIST(clist_modul), 1, 270); gtk_clist_set_column_width(GTK_CLIST(clist_modul), 2, 270); gtk_container_add(GTK_CONTAINER(scrolled_window), clist_modul); set_modul_info(); gtk_widget_show(clist_modul); } void set_modul_info() { /* 原来是这个函数中出现某种问题, * 删除这个函数后可以出现所有控件 * 于是我干脆把那个函数直接整合到这个函数中来 * 结果可以运行来! * 我认为可能是将控件作为函数参数传递出的问题 */ /* 读取当前进程信息,并显示到列表框中 */ //add_modules_view(clist_modul); /* 原来用的是5000,出现问题,于是变小,可以 */ char infoBuf[2000]; //暂存读取的modules文件内容 int fd = open("/proc/modules", O_RDONLY); read(fd, infoBuf, sizeof(infoBuf)); close(fd); unsigned int lines = 0; unsigned int i = 0; gtk_clist_clear(clist_modul); /* 先取得行数 */ while (i != sizeof(infoBuf) / sizeof(char)) { if (infoBuf[i] == '\n') lines++; i++; } i = 0; for (i = 1; i <= lines; i++) { char convert_mem[25]; char modName[25]; //模块名 char memUse[20]; //内存量 char times[5]; //使用次数 int mem_num; float real_mem; getModInfo(infoBuf, i, modName, memUse, times); mem_num = atoi(memUse); real_mem = (float) mem_num / (1024); gcvt(real_mem, 3, convert_mem); gchar *list[1][3] = { { modName, convert_mem, times } }; gtk_clist_append((GtkCList*) clist_modul, list[0]); gtk_clist_thaw((GtkCList *) clist_modul); //更新list列表显示 } } void getModInfo(char store[], int i, char modName[], char memUse[], char times[]) { int j = 0; int cflags = 0; //记录读取的回车键个数以便判断行数 int k = 0; char name2[25]; char mem2[20]; char times2[5]; while (cflags < i - 1) { if (store[j] == '\n') cflags++; //回车数加1 j++; } while (store[j] != ' ') { //读取进程名 name2[k++] = store[j]; j++; } name2[k] = '\0'; j++; //跳转到下一个不是空格的地方 k = 0; while (store[j] != ' ') { mem2[k++] = store[j]; j++; } mem2[k] = '\0'; //封口 j++; times2[0] = store[j]; //读取模块的使用次数 times2[1] = '\0'; //封口 strcpy(modName, name2); strcpy(memUse, mem2); strcpy(times, times2); } void add_modul(void) { system("insmod ./devDrv.ko"); set_modul_info(); } void remove_modul(void) { system("rmmod devDrv."); set_modul_info(); } #endif /* MODULE_H_ */
/* * process.h * helloWorld * Created on: 2012-2-19 * Author: zhushengben */ #ifndef PROCESS_H_ #define PROCESS_H_ GtkWidget * clist; GtkWidget *label_proc; GtkWidget *label_time; /* 刷新信息 */ void set_proc_info(); /* 表示读取第i个空格之前的一个字符串(此即获得的数据)) */ void read_info(char store[], int i, char get[]); /* 用户选中某一行时的回调函数*/ void selection_made(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data); void createProPage(GtkWidget* notebook) { char buffer[100]; GtkWidget * table; GtkWidget *frame_up; GtkWidget *frame_down; GtkWidget *vbox; GtkWidget *font; GtkWidget *tooltip; GdkColor color; GtkWidget *frame = gtk_frame_new(""); gtk_container_set_border_width(GTK_CONTAINER(frame), 10); gtk_widget_set_size_request(frame, 100, 355); gtk_widget_show(frame); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, gtk_label_new( "进程信息")); /* 建一个表格,分为上下两部分 */ table = gtk_table_new(10, 4, TRUE); /* 将这个表添加到框架 */ gtk_container_add(GTK_CONTAINER(frame), table); /* 建一个frame在表左下边显示标签信息 */ frame_up = gtk_frame_new("*0(^_^)0*"); gtk_table_attach_defaults(GTK_TABLE(table), frame_up, 0, 2, 7, 10); gtk_widget_show(frame_up); gtk_widget_show(table); /* 建一个标签显示进程数等(用button代替) */ label_proc = gtk_button_new_with_label("good"); gtk_container_add(GTK_CONTAINER(frame_up), label_proc); /* 连接刷新 */ g_signal_connect(G_OBJECT(label_proc), "clicked", G_CALLBACK(set_proc_info), NULL); tooltip = gtk_tooltips_new(); gtk_tooltips_set_tip(tooltip, label_proc, "点击刷新", NULL); gtk_widget_show(label_proc); /* 建一个frame在表右下边显示标签信息 */ frame_up = gtk_frame_new("(*^_^*)"); gtk_table_attach_defaults(GTK_TABLE(table), frame_up, 2, 4, 7, 10); gtk_widget_show(frame_up); gtk_widget_show(table); /* 建一个标签显示系统时间(用button代替) */ label_time = gtk_button_new_with_label("good"); gtk_tooltips_set_tip(tooltip, label_time, "点击刷新", NULL); g_signal_connect(G_OBJECT(label_time), "clicked", G_CALLBACK(set_proc_info), NULL); gtk_container_add(GTK_CONTAINER(frame_up), label_time); gtk_widget_show(label_time); /* 建一个frame在表下边显示进程信息 */ frame_down = gtk_frame_new("进程信息表"); gtk_table_attach_defaults(GTK_TABLE(table), frame_down, 0, 4, 0, 7); gtk_widget_show(frame_down); gtk_widget_show(table); /* 创建一个滚动窗口构件,将GtkCList组装到里面。 * 这样使得内容超出列表时,可以用滚动条浏览*/ GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(frame_down), scrolled_window); gtk_widget_show(scrolled_window); gchar *titles[5] = { "进程名", "进程PID", "进程状态", "占用内存", "优先级" }; /* 创建GtkCList构件。本例中,我们使用了5列*/ clist = gtk_clist_new_with_titles(5, titles); gtk_tooltips_set_tip(tooltip, clist, "点击杀死进程", NULL); /* 当作出选择时,我们要知道选择了哪一个单元格。 * 使用 selection_row回调函数,代码在clist.h可以看见*/ gtk_signal_connect(GTK_OBJECT(clist), "select_row", GTK_SIGNAL_FUNC( selection_made), NULL); /* 不一定要设置边框的阴影,但是效果挺不错*/ gtk_clist_set_shadow_type(GTK_CLIST(clist), GTK_SHADOW_OUT); /* 设置每一列到宽度 */ gtk_clist_set_column_width(GTK_CLIST(clist), 0, 200); gtk_clist_set_column_width(GTK_CLIST(clist), 1, 120); gtk_clist_set_column_width(GTK_CLIST(clist), 2, 110); gtk_clist_set_column_width(GTK_CLIST(clist), 3, 100); gtk_clist_set_column_width(GTK_CLIST(clist), 4, 100); gtk_container_add(GTK_CONTAINER(scrolled_window), clist); gtk_widget_show(clist); set_proc_info(); } void set_proc_info() { /* 读取当前进程信息,并显示到列表框中 */ DIR *dir; struct dirent *ptr; dir = opendir("/proc"); char path[20]; //记录pid的数字文件夹 int fd; //文件描述,用于打开那些数字文件夹的stat文件 char store[1000]; //将读取的stat文件内容暂时存放到store中 char name[20]; //进程名 char pid_num[20]; //pid号 char stat[20]; //状态 char memory[20]; //内存 char priority[20]; //优先级 gtk_clist_clear(GTK_CLIST(clist)); while ((ptr = readdir(dir)) != NULL) { if ((ptr->d_name[0] >= '0') && (ptr->d_name[0] <= '9')) { sprintf(path, "/proc/%s/stat", ptr->d_name); //将此文件的全部路径写入name中 //打开这个文件,并且从中读取到有用的信息放在相应的数组中 fd = open(path, O_RDONLY); read(fd, store, sizeof(store)); close(fd); read_info(store, 1, pid_num); //进去的是字符串和号,出来对应信息修改 read_info(store, 2, name); //读取名称 read_info(store, 3, stat); //进程状态,SDR已经转化为中文 read_info(store, 18, priority); //优先级 read_info(store, 23, memory); //注意是以B为单位,需要换算 int mem_num = atoi(memory); //转换成整数形式B为单位 float real_mem = (float) mem_num / (1024 * 1024); //得到MB为单位的信息 char convert_mem[25]; gcvt(real_mem, 5, convert_mem); //浮点数转换成字符串 gchar *list[1][5] = { { name, pid_num, stat, convert_mem, priority } }; /* 把这一行加入到clist中 */ gtk_clist_append((GtkCList*) clist, list[0]); gtk_clist_thaw((GtkCList *) clist); //更新list列表显示 } } closedir(dir); } /* 用户选中某一行时的回调函数*/ void selection_made(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data) { /* 取得存储在被选中的行和列的单元格上的文本 * 当鼠标点击时,我们用t e x t参数接收一个指针*/ gchar *Pid, *procName, buffer[40] = "Kill the process <"; /* 该函数读取CLIST被选中到PID, * 它与gtk_clist_set_text函数功能相反。*/ gtk_clist_get_text(GTK_CLIST(clist), row, 1, &Pid); gtk_clist_get_text(GTK_CLIST(clist), row, 0, &procName); selectedRow = row; strcat(buffer, procName); strcat(buffer, "> !?"); GtkWidget *dialog; dialog = gtk_message_dialog_new(NULL, // GTK_DIALOG_DESTROY_WITH_PARENT, //跟随父窗口关闭 GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,// buffer); gtk_window_set_title(GTK_WINDOW(dialog), "*0(^_^)0*"); GtkResponseType result = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); if (result == GTK_RESPONSE_YES || result == GTK_RESPONSE_APPLY) { killProcess(Pid); } return; } /* 根据一个pid杀死进程 */ /* 使用全局变量PID */ void killProcess(gchar *Pid) { gchar killCmd[50] = "kill "; strcat(killCmd, Pid); system(killCmd); g_printf("%s", killCmd); /* 用gtk_clist_clear函数清除列表 * void gtk_clist_remove (GtkCList *clist,gint row); * 该函数用来删除某一索引行。 * 行数确定时,直接对应第二个参数即可。 * 对于行数不确定,而是由鼠标或键盘随机获得焦点行的动态行删除问题, * 在具体编程实现上,可以通过利用CLIST列表构件头文件 * gtkclist.h内GtkCList结构中的属性变量focus_row来实现,语句如下: * gtk_clist_remove (GTK_CLIST(clist),GTK_CLIST (clist)->focus_row);*/ gtk_clist_remove(clist, selectedRow); GtkWidget *dialog;//声明一个对话框 /* 新建一个消息对话框 */ dialog = gtk_message_dialog_new(NULL, //没有父窗口 GTK_DIALOG_DESTROY_WITH_PARENT, //跟随父窗口关闭 GTK_MESSAGE_WARNING, //显示警告图标 GTK_BUTTONS_OK, //显示OK按钮 ("人生寂寞啊,被人杀死了!")); //提示信息的内容 gtk_window_set_title(GTK_WINDOW(dialog), ("进程已经被杀死……"));//对话框的标题 gtk_dialog_run(GTK_DIALOG(dialog));//运行对话框 gtk_widget_destroy(dialog);//删除对话框 } void set_label_proc_text() { char buffer[100]; char processes[10]; getInforAftSpace("/proc/stat", "processes", processes); strcpy(buffer, "当前进程数 : "); strcat(buffer, processes); char btime[10];//系统运行时间 char times[30]; int fd = open("/proc/uptime", O_RDONLY); read(fd, times, sizeof(times)); close(fd); read_info(times, 0, btime); float fInfor = (float) atof(btime); fInfor = fInfor / 60; //将单位化成min gcvt(fInfor, 5, btime); strcat(buffer, "\n系统运行时间 : "); strcat(buffer, btime); strcat(buffer, " min"); char aveLoad[20]; get_load_avg(aveLoad); strcat(buffer, "\n平均负载 : "); strcat(buffer, aveLoad); gtk_button_set_label((GtkButton*) label_proc, buffer); strcpy(buffer, "--------------点击刷新------------\n\n当前时间 :"); time_t rawtime; struct tm * timeinfo; time(&rawtime); timeinfo = localtime(&rawtime); strcat(buffer, asctime(timeinfo)); gtk_button_set_label((GtkButton*) label_time, buffer); } #endif /* PROCESS_H_ */
/* * showAbout.h * systemMonitor * Created on: 2012-2-19 * Author: zhushengben */ #ifndef SHOWABOUT_H_ #define SHOWABOUT_H_ void showAbout(void) { GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file("3.png", NULL); GtkWidget *dialog = gtk_about_dialog_new(); gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(dialog), "Ubuntu 系统监视器"); gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), "beta0.1"); gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog), "Copyright © 2012-2114 ZhuShengben"); gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog), "查看当前进程,监视系统状态 ."); gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(dialog), "http://user.qzone.qq.com/337075552"); gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(dialog), pixbuf); g_object_unref(pixbuf), pixbuf = NULL; gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } /* 创建一个滚动文本区域,用于显示一个"信息" */ void createAboutPage(GtkWidget* notebook) { GtkWidget *label; GtkWidget *table; GtkWidget *button; GtkWidget *align; GtkWidget *tooltip; GtkWidget *vbox; GtkWidget *scrolled_window; GtkWidget *view; GtkWidget *vpaned; GtkTextBuffer * buffer; GtkWidget *frame = gtk_frame_new("编辑邮件"); gtk_container_set_border_width(GTK_CONTAINER(frame), 10); gtk_widget_set_size_request(frame, 120, 500); gtk_widget_show(frame); /* 将该标签页加入到notebook中 */ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, gtk_label_new( "错误报告")); /* 在顶级窗口上添加一个垂直分栏窗口构件 */ vpaned = gtk_vpaned_new(); gtk_container_add(GTK_CONTAINER(frame), vpaned); gtk_widget_show(vpaned); /* 在分栏窗口的两部分各添加一些构件 */ scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_paned_add1(GTK_PANED(vpaned), scrolled_window); view = gtk_text_view_new(); gtk_container_add(GTK_CONTAINER(scrolled_window), view); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); insert_text(buffer, TRUE); gtk_widget_show_all(scrolled_window); gtk_widget_show(scrolled_window); scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_paned_add2(GTK_PANED(vpaned), scrolled_window); view = gtk_text_view_new(); gtk_container_add(GTK_CONTAINER(scrolled_window), view); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); insert_text(buffer, FALSE); gtk_widget_show_all(scrolled_window); gtk_widget_show(scrolled_window); /* 建一个表格,将下半部分为10行,10列 */ // table = gtk_table_new(10, 10, TRUE); /* 将这个表添加到框架 */ // gtk_container_add(GTK_CONTAINER(frame), table); /* 创建一个居中对齐的对象 */ align = gtk_alignment_new(0.5, 0.5, 0.8, 0); gtk_container_add(GTK_CONTAINER(frame), align); gtk_widget_show(align); button = gtk_button_new_with_label("Submit"); gtk_container_add(GTK_CONTAINER(align), button); tooltip = gtk_tooltips_new(); gtk_tooltips_set_tip(tooltip, button, "点击发送", NULL); gtk_widget_show(button); } /* 向文本构件中添加一些文本*/ void insert_text(GtkTextBuffer *buffer, gboolean thanks) { GtkTextIter iter; gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0); if (TRUE == thanks) gtk_text_buffer_insert(buffer, &iter,// "From: @nasa.gov\n" "To: [email protected]\n" "Subject: Bugs found !\n" "There are some bugs just as follows:\n" // , -1); else gtk_text_buffer_insert(buffer, &iter,// "介绍\n" "*\n" "系统监视器手册 V2.2\n" " 系统监视器程序使您能够显示系统的基本信息,并能够监视系统进程、系统资源使用情况和文件系统。您也可以用系统监视器来修改系统的行为。\n" "系统监视器包含四个选项卡部分\n" "系统\n" " 显示计算机硬件和软件的不同基本信息。\n" "发行版\n" "*\n" " 发行版版本\n" "*\n" " Linux 内核版本\n" "*\n" " GNOME 版本\n" " 硬件\n" "*\n" " 安装的内存\n" "*\n" " 处理器和速度\n" " 系统状态\n" "*\n" " 当前可用磁盘空间\n" "处理器\n" " 显示活动进程和进程之间的相互关系。为每个单独进程提供详细信息,并使您能够控制活动进程。\n" " 资源\n" " 显示以下系统资源的当前使用情况。\n" "*\n" " CPU(中央处理器)时间\n" "*\n" " 内存和交换空间\n" "*\n" " 网络使用情况\n" " 文件系统\n" "% CPU\n" " 选中此项以显示进程当前使用的 CPU 时间百分率。\n" "CPU 时间\n" " 选中此项以显示进程已作用的 CPU 时间。\n" "启动\n" " 选中此项以显示进程开始运行的时间。\n" "优先级\n" " 选中此项以显示进程的 nice 值。nice 值设置进程的优先级:nice 值越低,优先极越高。\n" "ID\n" " 选中此项以显示进程标识符,也即 pid。pid 是一个唯一标识进程的数字。您可以使用 pid 在命令行操纵进程。\n" "内存\n" " 选中此项以显示进程当前占用的系统内存大小。\n" // , -1); } /* 设置背景图片 */ void update_widget_bg(GtkWidget *widget, gchar *img_file) { GtkStyle *style; GdkPixbuf *pixbuf; GdkPixmap *pixmap; gint width, height; pixbuf = gdk_pixbuf_new_from_file(img_file, NULL); width = gdk_pixbuf_get_width(pixbuf); height = gdk_pixbuf_get_height(pixbuf); pixmap = gdk_pixmap_new(NULL, width, height, 24); gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, NULL, 0); style = gtk_style_copy(GTK_WIDGET(widget)->style); if (style->bg_pixmap[GTK_STATE_NORMAL]) g_object_unref(style->bg_pixmap[GTK_STATE_NORMAL]); style->bg_pixmap[GTK_STATE_NORMAL] = g_object_ref(pixmap); style->bg_pixmap[GTK_STATE_ACTIVE] = g_object_ref(pixmap); style->bg_pixmap[GTK_STATE_PRELIGHT] = g_object_ref(pixmap); style->bg_pixmap[GTK_STATE_SELECTED] = g_object_ref(pixmap); style->bg_pixmap[GTK_STATE_INSENSITIVE] = g_object_ref(pixmap); gtk_widget_set_style(GTK_WIDGET(widget), style); g_object_unref(style); } #endif /* SHOWABOUT_H_ */
/* * showImage.h * SystemMonitor * Created on: 2012-2-24 * Author: zhushengben */ #ifndef SHOWIMAGE_H_ #define SHOWIMAGE_H_ void showImage(int argc, char *argv[]) { GtkWidget *window = NULL; GdkPixbuf *pixbuf = NULL; GdkBitmap *bitmap = NULL; GdkPixmap *pixmap = NULL; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC( gtk_main_quit), NULL); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC( gtk_main_quit), NULL); gtk_window_set_decorated(GTK_WINDOW(window), FALSE); // 设置无边框 gtk_widget_set_app_paintable(window, TRUE); gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); gtk_widget_realize(window); pixbuf = gdk_pixbuf_new_from_file("penguin.gif", NULL); // gdk函数读取png文件 gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, &bitmap, 120); // alpha小于128认为透明 gtk_widget_shape_combine_mask(window, bitmap, 0, 0); // 设置透明蒙板 gdk_window_set_back_pixmap(window->window, pixmap, FALSE); // 设置窗口背景 g_object_unref(pixbuf); g_object_unref(bitmap); g_object_unref(pixmap); gtk_widget_show_all(window); gtk_main(); } #endif /* SHOWIMAGE_H_ */
/* * menuBar.h * systemMonitor * Created on: 2012-2-19 * Author: zhushengben */ #ifndef MENUBAR_H_ #define MENUBAR_H_ #include
/* * progressBar.h * systemMonitor * Created on: 2012-2-19 * Author: zhushengben */ #ifndef PROGRESSBAR_H_ #define PROGRESSBAR_H_ typedef struct ProgressData { GtkWidget *pbar; int timer; gboolean activity_mode; gboolean showCpuProgress; } _ProgressData; _ProgressData *pdata; int createProgressBar(GtkWidget *vbox, gboolean activity_mode, gboolean showCpuProgress) { GtkWidget *align; GtkWidget *separator; GtkWidget *table; GtkWidget *button; GtkWidget *check; /* 为传递到回调函数中的数据分配内存 */ pdata = g_malloc(sizeof(_ProgressData)); pdata->showCpuProgress = showCpuProgress; /* 创建进度条 */ pdata->pbar = gtk_progress_bar_new(); gtk_container_add(GTK_CONTAINER(vbox), pdata->pbar); gtk_progress_bar_set_orientation(pbar_cpu, GTK_PROGRESS_BOTTOM_TO_TOP); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pdata->pbar), "running..."); pdata->activity_mode = activity_mode; gtk_widget_show(pdata->pbar); separator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, FALSE, 0); gtk_widget_show(separator); return 0; } #endif /* PROGRESSBAR_H_ */
/* * refresh.h * SystemMonitor * Created on: 2012-2-21 * Author: zhushengben */ #ifndef REFRESH_H_ #define REFRESH_H_ /* 更新进度条,这样就能够看到进度条的移动 */ gint refresh(gpointer data) { /* cpu */ /* 建一个矩形绘图区 */ GdkGC *gc_chart = gdk_gc_new(cpu_draw_area->window); // update_widget_bg(gc_chart, BACK_IMAGE); /* 背景颜色 */ GdkColor color; color.red = 0x0000; color.green = 0x0000; color.blue = 0x0000; gdk_gc_set_rgb_fg_color(gc_chart, &color); int width, height, curPoint, step; cpu_rate = getCpuUseRatio() / 100; gdk_draw_rectangle(cpu_graph, gc_chart, TRUE, 0, 0, cpu_draw_area->allocation.width, cpu_draw_area->allocation.height); width = cpu_draw_area->allocation.width; height = cpu_draw_area->allocation.height; curPoint = (int) (cpu_rate * (double) height); cpuPoints[99] = height - curPoint; int i; for (i = 0; i < 99; i++) { /* 后一时刻的为前面取代 */ cpuPoints[i] = cpuPoints[i + 1]; } step = width / 99; GdkGC *gc = gdk_gc_new(GDK_DRAWABLE(cpu_graph)); gdk_color_parse("darkred", &color); if (cpu_rate > 0.1) gdk_color_parse("red", &color); gdk_gc_set_foreground(gc, &color); /* gdk_gc_set_line_attributes(GdkGC *gc,// line_width, GdkLineStyle line_style, GdkCapStyle cap_style, GdkJoinStyle join_style); */ gdk_gc_set_line_attributes(gc, 1, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_MITER); for (i = 99; i >= 1; i--) { gdk_draw_line(GDK_DRAWABLE(cpu_graph), gc, i * step, cpuPoints[i], /* 第一个点坐标 */ (i - 1) * step, cpuPoints[i - 1]); /* 第二个点坐标 */ } gtk_widget_queue_draw(cpu_draw_area); char buffer[50] = "cpu使用率:\n\n"; char cbuf[5]; gcvt(cpu_rate * 100, 5, cbuf); strcat(cbuf, "%"); strcat(buffer, cbuf); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar_cpu), buffer); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar_cpu), cpu_rate); _ProgressData *pdata = (_ProgressData *) data; gdouble new_val; if (pdata->activity_mode) gtk_progress_bar_pulse(GTK_PROGRESS_BAR(pdata->pbar)); else { if (!pdata->showCpuProgress) { /* 使用在调整对象中设置的取值范围计算进度条的值 */ new_val = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR( pdata->pbar)) + 0.01; if (new_val > 1.0) new_val = 0.0; } else new_val = cpu_rate; /* 设置进度条的新值 */ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pdata->pbar), new_val); } set_label_mem_text(); set_label_proc_text(label_proc); /* 这是一个 timeout 函数,返回 TRUE,这样它就能够继续被调用 */ return TRUE; } #endif /* REFRESH_H_ */
/* * searchInfor.h * helloWorld * Created on: 2012-2-19 * Author: zhushengben */ #ifndef SEARCHINFOR_H_ #define SEARCHINFOR_H_ #include