📄 callbacks.c
字号:
int p_rss; int total_ram;// int ps;// int rc;// int cpu,nice,system,idle;// int total_cpu;/*// On %CPU Calculation:// ---------------------------------------------------------------------------------------// From the LibGTop Reference (http://www.home-of-linux.org/gnome/libgtop)// "Please note that all of the cpu values are absolute values measured in certain units// (to get seconds, divide them by frequency) since system boot. To get percentual values,// you need to call glibtop_cpu, save the result, wait some time and then call it again// and divide the differences of the two values by the time you have waited."*/// Get TOTAL_CPU and TOTAL_MEM/* TOO DAMN SLOW! - 05/01 ps = open("/proc/stat", O_RDONLY); rc = read(ps, readbuf, sizeof(readbuf)); close(ps); sscanf(readbuf, "%*s %d %d %d %d", &cpu, &nice, &system, &idle); total_cpu = cpu+nice+system+idle;*/ // Refreshing causes any selected row to be unselected, so disable Signal Button gtk_widget_set_sensitive((GtkWidget *) signal_apply, FALSE); gtk_widget_set_sensitive((GtkWidget *) combo6, FALSE); // Clear clist & clear pid2kill value gtk_clist_clear(GTK_CLIST(process_clist)); pid2kill = 0; // Clear and Disable gtk_text showing selected_pid gtk_label_set_text(GTK_LABEL(label_selected_pid), "N/A"); gtk_widget_set_sensitive((GtkWidget *) label_selected_pid, FALSE); // Execute sysinfo() system call (fill struct with data). if (sysinfo(&info) != 0) { printf("ERROR: sysinfo call FAILED. \n"); return; } // Set total_ram memory amount - used for %MEM below total_ram = (info.totalram / 1024); // Set column justifications gtk_clist_set_column_justification(GTK_CLIST(process_clist), 0, GTK_JUSTIFY_RIGHT); gtk_clist_set_column_justification(GTK_CLIST(process_clist), 1, GTK_JUSTIFY_CENTER); gtk_clist_set_column_justification(GTK_CLIST(process_clist), 2, GTK_JUSTIFY_RIGHT); gtk_clist_set_column_justification(GTK_CLIST(process_clist), 3, GTK_JUSTIFY_CENTER); gtk_clist_set_column_justification(GTK_CLIST(process_clist), 4, GTK_JUSTIFY_LEFT); gtk_clist_set_column_justification(GTK_CLIST(process_clist), 5, GTK_JUSTIFY_RIGHT);// gtk_clist_set_column_justification(GTK_CLIST(process_clist), 6, GTK_JUSTIFY_RIGHT); // Get %CPU and %MEM// too damn slow!// sprintf(proc_file_name, "ps --pid %s -uwh | sed -e 's/ */ /g' | cut -d' ' -f3,4,5 > /home/brent/test.txt", dinfo->d_name);// pipein_fp = popen(proc_file_name, "r");// pclose(pipein_fp); /* redirect stdin to /proc/meminfo *//* free.c: if (open( "/proc/meminfo", O_RDONLY ) < 0) { perror("open"); return 2; } fseek(stdin, 0L, SEEK_SET); fgets( buf1, 80, stdin );*/ // Parse all sub-dirs in proc for their stats using while loop dir = opendir("/proc/"); while ((dinfo = readdir(dir)) != 0) { // Step through /proc sub-directory names one number at-a-time // find directories with names between 0-9 (processes). dir_chr = dinfo->d_name; while (*dir_chr) { if ((*dir_chr >= '0') && (*dir_chr <= '9')) { dir_chr++; } else { break; } } if (*dir_chr) { continue; } // Read each entry in the /proc directory strcpy(proc_file_name, "/proc/"); strcat(proc_file_name, dinfo->d_name); strcat(proc_file_name, "/stat"); // Open a pipe to the proc stat file and read info pipein_fp = fopen(proc_file_name, "r"); fscanf(pipein_fp, "%*d %s %c %d %*d %*d %*d %*d %*u %*u %*u %*u %*u %d %d %*d %*d %*d %d %*u %*u %d %u %u", st_buffer,&p_state,&p_parentpid,&st_utime,&st_stime, &st_pri,&st_starttime,&st_vms,&p_rss); fclose(pipein_fp); // Get CPU Usage 1 proc_total_cputime1 = ((float)st_utime + (float)st_stime); sleep(0.1); // Get CPU Usage 2 pipein_fp = fopen(proc_file_name, "r"); fscanf(pipein_fp, "%*d %s %c %d %*d %*d %*d %*d %*u %*u %*u %*u %*u %d %d %*d %*d %*d %d %*u %*u %d %u %u", st_buffer,&p_state,&p_parentpid,&st_utime,&st_stime, &st_pri,&st_starttime,&st_vms,&p_rss); fclose(pipein_fp); proc_total_cputime2 = ((float)st_utime + (float)st_stime); // Calculate %CPU for this proc proc_cpu_usage = ((proc_total_cputime2 - proc_total_cputime1) / 0.001);/* // Following 2 lines from gpsui 2.2 app - 10/14/2001 - GOOD?? temp = (float) (st_stime + st_utime) / (float) (uptime - st_starttime); cputime = temp * 100;*/// printf("DEBUG: proc_total_cputime1=%d proc_total_cputime2=%d \n", proc_total_cputime1, proc_total_cputime2); // Get process owner info stat(proc_file_name, &finfo); pinfo = getpwuid(finfo.st_uid); // Fill strings sprintf(st_buf2, "%c%c", p_state, p_rss ? ' ':'W'); sprintf(st_buf3, "%d", p_parentpid); sprintf(st_buf4, "%d", p_rss); // p_rss = Memory Used // Get %CPU and %MEM// sprintf(proc_file_name, "ps --pid %s -uwh | sed -e 's/ */ /g' | cut -d' ' -f3,4,5 > /home/brent/test.txt", dinfo->d_name);/* pipein_fp = popen(proc_file_name, "r"); pclose(pipein_fp); if ((pipein_fp = fopen("/home/brent/test.txt", "r")) == NULL) { ferror("fopen"); exit(1); } while (fgets(readbuf, 80, pipein_fp)) { proc_str_list[0] = strtok(readbuf, " "); proc_str_list[5] = strtok(NULL, " "); } proc_str_list[6] = strtok(readbuf, " "); // CPU% proc_str_list[5] = strtok(NULL, " "); // MEM% // NOW CPU!!!// printf("DEBUG: PID=%s CPU=%s %d %d \n", dinfo->d_name, proc_str_list[5],st_utime,st_stime); pclose(pipein_fp);*/ // DEBUG ONLY!!!!// sprintf(proc_str_list[6], "%2.1f", ((100.0*(st_utime)) / 121000) ); //total_cpu));// sprintf(proc_str_list[6], "%2.1f", ((100.0*(st_utime+st_stime)) / 121000) ); //total_cpu));// printf("%d - %2.1f - %d \n", (100.0 * (float)p_rss / 94516), (100.0 * (float)p_rss / 94516), p_rss);//bad proc_str_list[5] = ((100 * (float)p_rss) / 94516); //total_mem);// proc_str_list[6] = dinfo->d_name; // DEBUG ^^^ // Format/Construct %CPU and %MEM strings sprintf(mem_str, "%2.1f", ((100 * 4 * (float)p_rss) / total_ram));// sprintf(mem_str, "%2.1f", proc_cpu_usage);// from 'ps' src sprintf(cpu_str, "%2.1f", ((float)proc_total_cputime * 10 * 100/180)); // was 100/Hertz// p->amount = total ? 100*(float)(p->user_time+p->kernel_time)/total : 0; // Add info to proc_clist one row at-a-time. proc_str_list[0] = dinfo->d_name; proc_str_list[1] = pinfo->pw_name; proc_str_list[2] = st_buf3; proc_str_list[3] = st_buf2; proc_str_list[4] = st_buffer; proc_str_list[5] = mem_str; // BRENT! - it would be cool to change color of text if proc_state = 'Z' - 04/24/01 // "moving to 0.9.6" as the mozilla team is fond of saying.. :-)// gtk_clist_set_cell_style (GTK_CLIST(process_clist), gint row, gint column, GtkStyle *style); gtk_clist_append(GTK_CLIST(process_clist), proc_str_list); }}/*****************************************************************************/voidon_process_clist_click_column (GtkCList *clist, gint column, gpointer user_data){ // Get pointers to window widgets, declare local vars GtkWidget *process_clist = lookup_widget(app1, "process_clist"); static int current_col = -1; // Set global var to use for compare function sorting. compare_col = column; // Set the column number to apply sort to gtk_clist_set_sort_column(GTK_CLIST(process_clist), column); // Choose sort type to pass to GTK (NULL = default, which is good for CHAR strings) // i wrote my own compare function per the GNOME docs to sort numeric columns. if ((column == 1) || (column == 3) || (column == 4)) { gtk_clist_set_compare_func(GTK_CLIST(process_clist), NULL); } else { gtk_clist_set_compare_func(clist, compare); } // Based upon current sort (ASC or DESC), choose sort order for this iteration. if (current_col == column) { gtk_clist_set_sort_type(GTK_CLIST(process_clist), GTK_SORT_DESCENDING); current_col = -1; } else { gtk_clist_set_sort_type(GTK_CLIST(process_clist), GTK_SORT_ASCENDING); current_col = column; } // Sort the column in process_clist widget gtk_clist_sort(clist);}/*****************************************************************************/voidon_process_clist_select_row (GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data){ // Local Variables GtkWidget *signal_apply = lookup_widget(app1, "signal_apply"); GtkWidget *combo6 = lookup_widget(app1, "combo6"); GtkWidget *label_selected_pid = lookup_widget(app1, "label_selected_pid"); GtkWidget *frame52 = lookup_widget(app1, "frame52"); gchar *pid_text; // Get the contents of column 0 (pid) from user selected column gtk_clist_get_text(GTK_CLIST(clist), row, 0, &pid_text); // Set pid2kill global variable pid2kill = atoi(pid_text); // Clients cannot be allowed to kill INIT (gasp!), so disable <OK> button if (pid2kill == 1) { gtk_widget_set_sensitive((GtkWidget *)signal_apply, FALSE); gtk_widget_set_sensitive((GtkWidget *)combo6, FALSE); } else { // Reactivate Signal Button if it was disabled previously gtk_widget_set_sensitive((GtkWidget *)signal_apply, TRUE); gtk_widget_set_sensitive((GtkWidget *)combo6, TRUE); } // Set gtk_text showing selected pid, and resize frame gtk_label_set_text(GTK_LABEL(label_selected_pid), pid_text); gtk_widget_set_sensitive((GtkWidget *)label_selected_pid, TRUE); gtk_widget_queue_resize(GTK_WIDGET(frame52));}/*****************************************************************************/voidon_process_clist_unselect_row (GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data){ // The row was unselected somehow (page flip?, refresh?) so clear pid2kill value. pid2kill = 0;}/*****************************************************************************/gbooleanon_process_clist_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data){ // If button 3 (Right mouse click) then show popmenu with cool proc options! if (event->button == 3) { if (pid2kill >= 2) { gtk_menu_popup((GtkMenu *)proc_popmenu, NULL, NULL, NULL, NULL, event->button, event->time); } return TRUE; } else { return FALSE; }}/*****************************************************************************/voidon_send_sighup1_activate (GtkMenuItem *menuitem, gpointer user_data){ signum = 1; on_signal_apply_clicked (NULL, NULL); //gpointer user_data)}voidon_send_sigterm1_activate (GtkMenuItem *menuitem, gpointer user_data){ signum = 15; on_signal_apply_clicked (NULL, NULL); //gpointer user_data)}voidon_send_sigkill1_activate (GtkMenuItem *menuitem, gpointer user_data){ signum = 9; on_signal_apply_clicked (NULL, NULL); //gpointer user_data)}voidon_get_detailed_info1_activate (GtkMenuItem *menuitem, gpointer user_data){ // BRENT - 05/20 - what are we going to do here?}// ------------------------------------------------------------------------- //// ---> All Buttons from Workstation Utils Notebook Page Follow! <--- //// ------------------------------------------------------------------------- //voidon_button_ifconfig_clicked (GtkButton *button, gpointer user_data){ // Call function to perform operation and output to textbox. perform_wsutils_click("ifconfig");}voidon_button_netstat_clicked (GtkButton *button, gpointer user_data){ // Call function to perform operation and output to textbox. perform_wsutils_click("netstat");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -