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

📄 callbacks.c

📁 linux下可以连接并查看交换机当前运行情况的东东
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -