// Simple Process browser // // This code is free // // ?????? :: initial code ::michal.novak@vogel.cz // 010802 :: update browser window after kill :: a.holzer@cheese.at // 100902 :: close file f2 ::peyrl@sbox.TUGraz.at #include #include #include #include #include #include #include #include #include #include #include #include int a_pos = 1, info_state = 0; Fl_Select_Browser *b; void loadProcList(Fl_Select_Browser * browser); void b_cb(Fl_Widget * o, void *) { char *buffer, buf2[256]; sprintf(buf2, "%s", ((Fl_Browser *) o)->text(((Fl_Browser *) o)->value())); a_pos = atoi(buf2); } void updateBrowser(Fl_Select_Browser * b) { int p; p = b->position(); b->clear(); loadProcList(b); b->position(p); } void kill_cb(Fl_Widget * o, void *) { int r; r = kill(a_pos, SIGKILL); Fl::add_timeout(0.1, (void (*)(void*)) updateBrowser, b); } void done_cb(Fl_Widget * o, void *) { exit(0); } void update_cb(Fl_Widget * o, void *) { updateBrowser(b); } char *readCmdLine(FILE * f, char *n, int m) { int i; for (i = 0; i < m - 1; i++) { if ((n[i] = fgetc(f)) == EOF) break; if (n[i] == '\0') n[i] = ' '; } n[i] = '\0'; return (i == 0) ? NULL : n; } void loadProcList(Fl_Select_Browser * browser) { int x, y; FILE *f, *f2; char buffer[256], p_name[256], *p_state, out_put[256]; int s1; struct dirent *dentry; DIR *slashproc; y = 1; slashproc = opendir("/proc"); dentry = readdir(slashproc); while (dentry != NULL) { x = atoi(dentry->d_name); if (x != 0) { sprintf(buffer, "/proc/%d/cmdline", x); f = fopen(buffer, "r"); sprintf(buffer, "/proc/%d/stat", x); f2 = fopen(buffer, "r"); // if ((fgets(p_name, 256, f)) != NULL) { if (readCmdLine(f, p_name, 256) != NULL) { fgets(buffer, 256, f2); // addArgs(p_name,s1); p_state = strchr(strchr(buffer, ')'), ' '); p_state = strtok(p_state, p_state + 2); sprintf(out_put, "%04d\t%s\t%s", x, p_state, p_name); browser->insert(y, out_put, 0); y++; } fclose(f); fclose(f2); } dentry = readdir(slashproc); } } int main(int argc, char **argv) { int i; if (!Fl::args(argc, argv, i)) Fl::fatal(Fl::help); const char *fname = (i < argc) ? argv[i] : "Process browser"; Fl_Window window(160, 240, fname); Fl_Select_Browser browser(0, 0, 160, 230, 0); Fl_Button kill(130, 230, 30, 10, "kill"); Fl_Button done(0, 230, 30, 10, "done"); Fl_Button update(30, 230, 30, 10, "update"); kill.labelsize(9); done.labelsize(9); update.labelsize(9); browser.type(FL_MULTI_BROWSER); browser.position(0); browser.textsize(9); b = &browser; loadProcList(&browser); browser.callback(b_cb); kill.callback(kill_cb); done.callback(done_cb); update.callback(update_cb); window.show(argc, argv); return Fl::run(); }