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

📄 cuozuoxitongkechengsheji275913647.c

📁 GTK2.0编程 操作系统课程设计的一个小题目
💻 C
📖 第 1 页 / 共 3 页
字号:
   closedir(dirp);    //在这写取进程信息的程序段   char pidbuff[60];   sprintf(pidbuff,"当前进程数:%d(点击立即刷新)",COUNT_PID);   if(pidcountlab)gtk_button_set_label(GTK_BUTTON(pidcountlab),pidbuff);   return TRUE; }/***该函数用于结束所选择的进程*****/gint exit_selectpid(GtkWidget *widget,                    GtkWidget *event,                     gpointer   data )//结束选中的进程 gpointer data 参数传进来进程号{             int i;          int j;        if(gtk_clist_get_selectable(GTK_CLIST(clist),S_ROW)==TRUE)          {                                     char *text;               char killpid[20]="kill ";               GtkWidget *d; /***先弹出一对话框用以警示**********************************/                d = gtk_dialog_new_with_buttons ("结束进程",                                                  NULL,                                                  GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,                                                  GTK_STOCK_OK,                                                  GTK_RESPONSE_ACCEPT,                                                  GTK_STOCK_CANCEL,                                                  GTK_RESPONSE_REJECT,                                                  NULL);              GtkWidget *label = gtk_label_new ("结束进程?");              gtk_container_add (GTK_CONTAINER (GTK_DIALOG(d)->vbox),label);              gtk_widget_show(label);              gint result = gtk_dialog_run (GTK_DIALOG (d));              switch (result)                {                case GTK_RESPONSE_ACCEPT:/***如果点击确定**********/                     gtk_clist_get_text(GTK_CLIST(clist),S_ROW,1,&text);/*通过行号获取改行第一列的字符串*/                                                                                      /*即PID号*/                      for(i=0;isspace(text[i]);i++);                     for(j=i,i=0;j<strlen(text);j++,i++)                     killpid[i+5]=text[j];                      killpid[i+5]='\0';                     system(killpid);                       gtk_clist_remove(GTK_CLIST(clist),S_ROW);/*删除该行*/               	COUNT_PID--;        /*进程数减一*/              		S_ROW=10000;        /*使该行不呈现选择状态*/               	char pidbuff[60];               	sprintf(pidbuff,"当前进程数:%d(点击立即刷新)",COUNT_PID);               	if(pidcountlab)gtk_button_set_label(GTK_BUTTON(pidcountlab),pidbuff);                     break;                default:                     break;               }            gtk_widget_destroy (d);       }             return FALSE;  }/*在列表框中选中一行时调用该函数****/gboolean select_op(GtkWidget *widget,gint row,gint column,                    GtkWidget *event,                      gpointer   data ){              S_ROW=row;   /**用一外部变量保存所选择的行号***/       return TRUE;}/***查找一进程,可通过PID或进程名,查找成功,使该行处于选择状态****/void find_pid(GtkWidget *widget,gint row,gint column,                    GtkWidget *event,                      gpointer   data ){         int i;  char new_pidname[256];  GtkWidget *d = gtk_dialog_new_with_buttons ("My dialog",                                                  NULL,                                                  GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,                                                  GTK_STOCK_OK,                                                  GTK_RESPONSE_ACCEPT,                                                  GTK_STOCK_CANCEL,                                                  GTK_RESPONSE_REJECT,                                                           NULL);  GtkWidget *entry_pid=gtk_entry_new();  gtk_entry_set_text(GTK_ENTRY (entry_pid), "输入要待查进程的进程号(名)");  gtk_widget_show(entry_pid);  gtk_container_add (GTK_CONTAINER (GTK_DIALOG(d)->vbox),                      entry_pid);  gint result = gtk_dialog_run (GTK_DIALOG (d));  switch (result)    {      case GTK_RESPONSE_ACCEPT:         strcpy(new_pidname,gtk_entry_get_text(GTK_ENTRY (entry_pid)));         for(i=0;i<strlen(new_pidname)&&isdigit(new_pidname[i]);i++);          if(i==strlen(new_pidname))    //输入的是进程号             {             char *pid[20];             int j;              for(i=0;i<COUNT_PID;i++)                 {                gtk_clist_get_text(clist,i,1,pid);                for(j=0;j<strlen(pid[0])&&isspace(pid[0][j]);j++);          	  if(strcmp(new_pidname,pid[0]+j)==0)break;      	           }     	       if(i<COUNT_PID)                 {         	   gtk_clist_moveto(clist,i,0,0.5,0.2);         	   gtk_clist_select_row(clist,i,0);                  }         }else{       /*如果输入的是进程名*/               char *pid[20];                int j,k;                for(i=0;i<COUNT_PID;i++)                   {                  gtk_clist_get_text(clist,i,0,pid);                  for(j=0;j<strlen(pid[0])&&isspace(pid[0][j]);j++);                     if(strcmp(pid[0],new_pidname)==0)break;                        }                if(i<COUNT_PID)                      {                   gtk_clist_moveto(clist,i,2,0.5,0.2);                   gtk_clist_select_row(clist,i,2);                   }           }         if(i==COUNT_PID)            {              gtk_widget_destroy (d);              GtkWidget *dialog, *label;              dialog = gtk_dialog_new_with_buttons ("查找进程",                                         NULL,                                         GTK_DIALOG_DESTROY_WITH_PARENT,                                         GTK_STOCK_OK,                                         GTK_RESPONSE_NONE,                                         NULL);             label = gtk_label_new ("没有找到该进程");             gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),                      label);              gtk_widget_show(label);              gtk_dialog_run (GTK_DIALOG (dialog));              gtk_widget_destroy (dialog);               return;              }             break;      default:         break;    }    gtk_widget_destroy (d);    return; } /**绘制右键弹出菜单**********/gint popup_menu(GtkWidget *widget,GdkEvent *event){              if (event->type == GDK_BUTTON_PRESS)           { GdkEventButton *bevent = (GdkEventButton *) event;                             GtkWidget *menu=gtk_menu_new();               gtk_container_set_border_width (GTK_CONTAINER (menu), 5);                 GtkWidget  *menu_item;             if(S_ROW!=10000)               {                                 menu_item=gtk_menu_item_new_with_label("详细信息");                gtk_menu_append(menu,menu_item);                gtk_widget_show(menu_item);                   g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(more_info),NULL);                menu_item=gtk_menu_item_new_with_label("结束任务");                gtk_menu_append(menu,menu_item);                gtk_widget_show(menu_item);                   g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(exit_selectpid),NULL);                             }                menu_item=gtk_menu_item_new_with_label("新建任务");                gtk_menu_append(menu,menu_item);                gtk_widget_show(menu_item);                 g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(new_thread),NULL);                  menu_item=gtk_menu_item_new_with_label("查找进程");                gtk_menu_append(menu,menu_item);                gtk_widget_show(menu_item);                 g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(find_pid),NULL);                menu_item=gtk_menu_item_new_with_label("关于");                gtk_menu_append(menu,menu_item);                gtk_widget_show(menu_item);                  g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(help_about),NULL);                    menu_item=gtk_menu_item_new_with_label("退出");                gtk_menu_append(menu,menu_item);                gtk_widget_show(menu_item);                   g_signal_connect(G_OBJECT(menu_item),"activate",G_CALLBACK(delete),NULL);                gtk_menu_popup (GTK_MENU(menu), NULL, NULL, NULL, NULL,bevent->button, bevent->time);                                      return TRUE;          }      return FALSE;}     /***绘制第一个页面****/void draw_page0(GtkWidget *table){    char *s[]={"        进程     ","      pid      ","      ppid      ","  进程状态  "};//列表中的项     GtkWidget *scrolled_window;     scrolled_window = gtk_scrolled_window_new (NULL, NULL);        gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),                                    GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);     gtk_widget_show (scrolled_window);     clist=gtk_clist_new_with_titles(4,s);     gtk_table_attach_defaults(GTK_TABLE(table),scrolled_window,1,20,0,20);     gtk_container_add(GTK_SCROLLED_WINDOW(scrolled_window),clist);     gtk_widget_show(clist);     GtkWidget *btn=gtk_button_new_with_label("结束进程");     g_signal_connect(G_OBJECT(clist),"select-row",G_CALLBACK(select_op),NULL);      g_signal_connect(GTK_BUTTON(btn),"clicked",G_CALLBACK(exit_selectpid),NULL);      gtk_widget_show(btn);       gtk_table_attach_defaults(GTK_TABLE(table),btn,18,20,20,21);     btn=gtk_button_new_with_label("进程查找");     gtk_widget_show(btn);     g_signal_connect(GTK_BUTTON(btn),"clicked",G_CALLBACK(find_pid),NULL);     gtk_table_attach_defaults(GTK_TABLE(table),btn,16,18,20,21);     btn=gtk_button_new_with_label("切换任务");     gtk_widget_show(btn);     g_signal_connect(GTK_BUTTON(btn),"clicked",G_CALLBACK(new_thread),NULL);     gtk_table_attach_defaults(GTK_TABLE(table),btn,14,16,20,21);     pidcountlab=gtk_button_new_with_label("");     gtk_widget_show(pidcountlab);     gtk_table_attach_defaults(GTK_TABLE(table),pidcountlab,1,14,20,21);     g_signal_connect(GTK_BUTTON(pidcountlab),"clicked",G_CALLBACK(refresh_pidlist),NULL);     gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE);     refresh_pidlist();     GtkWidget *timer=gtk_timeout_add(5000,(GtkFunction)refresh_pidlist,NULL); }/***刷新系统运行总时间**********/void refresh_all_time(){      char buf[30];    get_string(0,buf);    gtk_label_set_text(GTK_LABEL(all_time_label),buf);    return;}    /*获取字符串,如可以调用该函数得到该所使用操作系统的版本*/void get_string(int flag,char *buf){    switch(flag)       {          case 0:read_file("/proc/uptime",buf);buf[strlen(buf)/2]='\0';break;          case 1:read_file("/proc/version",buf);buf[23]='\0';break;         case 2:read_file("/proc/cpuinfo",buf);select_string(buf,"vendor_id");break;         case 3:read_file("/proc/cpuinfo",buf);select_string(buf,"model name");break;         case 4:read_file("/proc/sys/kernel/hostname",buf);break;         default:break;           }      return; }/*********绘制第二个页面,就是显示系统相关信息的页面***********/void draw_page1(GtkWidget *table){     char buf[1024];   char *s[]={"系统启动的时间","系统到目前为止运行的时间","系统的版本号","cpu的型号","cpu的主频","主机名"};   int i=0;     GtkWidget *label;   label=gtk_label_new("系统信息");   gtk_widget_show(label);   gtk_table_attach_defaults(GTK_TABLE(table),label,1,20,0,1);   draw_line(table,1,20,1,2);   while(i++<5)     {label=gtk_label_new(s[i]);      gtk_widget_show(label);      gtk_table_attach_defaults(GTK_TABLE(table),label,1,20,i*3+2,i*3+3);      get_string(i-1,buf);      label=gtk_label_new(buf);      if(i==1)all_time_label=label;      gtk_widget_show(label);      gtk_table_attach_defaults(GTK_TABLE(table),label,1,20,i*3+3,3*i+4);      draw_line(table,1,20,i*3+4,3*i+5);       }     for(i=17;i<20;i++)      {     label=gtk_label_new("");     gtk_widget_show(label);     gtk_table_attach_defaults(GTK_TABLE(table),label,1,20,i,i+1);        }       return;     }/*绘制绿色的格子**/gboolean draw_pic(int flag){         int i;               if(drawing_area[flag]!=NULL&&pixmap[flag]!=NULL)        {           gdk_draw_rectangle (pixmap[flag],		     drawing_area[flag]->style->bg_gc[GTK_WIDGET_STATE(drawing_area[flag])],		     TRUE,		      0, 0,		      drawing_area[flag]->allocation.width,		      drawing_area[flag]->allocation.height);        for(i=0;i<=drawing_area[flag]->allocation.width/21+1;i++)               {                                       /*绘制竖线,加上count是为了产生移动的效果,因为count在定时刷新函数里每*/                    /*过一段时间就被改变(相关语句:count=(count+2)%21)*/                gdk_draw_line(pixmap[flag],                drawing_area[flag]->style->fg_gc[GTK_WIDGET_STATE (drawing_area[flag])],                (i*21-count)<0?0:(i*21-count),0,(i*21-count)<0?0:(i*21-count),                   /*绘制横线,不用移动*/                 drawing_area[flag]->allocation.height);                    gdk_draw_line(pixmap[flag],                drawing_area[flag]->style->fg_gc[GTK_WIDGET_STATE (drawing_area[flag])],0,i*21,                drawing_area[flag]->allocation.width,i*21);                  }             }     return TRUE;           }/* 从后端位图重新绘制屏幕 */static gintexpose_event_callback (GtkWidget *widget, GdkEventExpose *event,gpointer data){  int flag=data;  if(pixmap[flag]!=NULL&&drawing_area[flag]!=NULL)   {    gdk_draw_pixmap(widget->window,		  widget->style->fg_gc[GTK_WIDGET_STATE (widget)],		  pixmap[flag],		  event->area.x, event->area.y,		  event->area.x, event->area.y,		  event->area.width, event->area.height);     }  return FALSE;}/*********绘制CPU利用率的曲线***************/void *draw_cpu_curve(){   draw_pic(0);   mm_cpu_node *p1,*p2;   int i=cpu_node_count;  if(drawing_area[0]!=NULL&&pixmap[0]!=NULL)    {   GdkColor color;   color.red=65535;   /*更改画曲线的颜色***/   color.green=0;   color.blue=0;   gtk_widget_modify_fg(drawing_area[0],GTK_STATE_NORMAL,&color);  if(i>=2)        /***如果链表中的节点个数小于2,则不绘制******/    {     for(p1=cpu_head,p2=cpu_head->next;p2;p1=p1->next,p2=p2->next,i--)         gdk_draw_line(pixmap[0],     /**在两个节点间画线***/                drawing_area[0]->style->fg_gc[GTK_WIDGET_STATE (drawing_area[0])],                drawing_area[0]->allocation.width-2*i,drawing_area[0]->allocation.height-p1->y-4,                drawing_area[0]->allocation.width-2*(i-1),                drawing_area[0]->allocation.height-p2->y-4);     }        color.green=65535;   /*将颜色复原*/       color.blue=25535;       color.red=35535;     gtk_widget_modify_fg(drawing_area[0],GTK_STATE_NORMAL,&color);     gtk_widget_draw (drawing_area[0],NULL);  /*曲线绘制完毕,通知绘图区将后端位图重新显示**/    }}/*绘制内存利用率曲线****/void *draw_mm_curve(){    draw_pic(1);   mm_cpu_node *p1,*p2;   int i=mm_node_count;  if(drawing_area[1]!=NULL&&pixmap[1]!=NULL)    {    GdkColor color;   color.red=65535;        /*更改画曲线的颜色***/   color.green=0;   color.blue=0;   gtk_widget_modify_fg(drawing_area[1],GTK_STATE_NORMAL,&color);  if(i>=2)            /***如果链表中的节点个数小于2,则不绘制******/    {     for(p1=mm_head,p2=mm_head->next;p2;p1=p1->next,p2=p2->next,i--)        gdk_draw_line(pixmap[1],    /**在两个节点间画线***/                drawing_area[1]->style->fg_gc[GTK_WIDGET_STATE (drawing_area[1])],                drawing_area[1]->allocation.width-2*i,drawing_area[1]->allocation.height-p1->y-15,                drawing_area[1]->allocation.width-2*(i-1),                drawing_area[1]->allocation.height-p2->y-15);       }        color.green=65535;       color.blue=25535;       color.red=35535;       gtk_widget_modify_fg(drawing_area[1],GTK_STATE_NORMAL,&color);

⌨️ 快捷键说明

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