annotate toys/pending/top.c @ 1396:e0c9c5424864 draft

Isaac Dunham spotted that dhcp was also reimplementing daemon().
author Rob Landley <rob@landley.net>
date Sun, 20 Jul 2014 21:34:49 -0500
parents 0ecfaa7022e8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1079
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* top.c - Provide a view of process activity in real time.
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2013 Bilal Qureshi <bilal.jmi@gmail.com>
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
4 * Copyright 2013 Ashwini Kumar <ak.ashwini@gmail.com>
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
5 * Copyright 2013 Kyungwan Han <asura321@gmail.com>
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
6 *
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
7 * No Standard
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
8
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
9 USE_TOP(NEWTOY(top, ">0d#=3n#<1mb", TOYFLAG_USR|TOYFLAG_BIN))
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
10
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
11 config TOP
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
12 bool "top"
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
13 default n
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
14 help
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
15
1265
0ecfaa7022e8 usage: is lower case (the help generator looks for that, might as well be consistent).
Rob Landley <rob@landley.net>
parents: 1079
diff changeset
16 usage: top [-mb] [ -d seconds ] [ -n iterations ]
1079
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
17
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
18 Provide a view of process activity in real time.
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
19 Keys
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
20 N/M/P/T show CPU usage, sort by pid/mem/cpu/time
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
21 S show memory
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
22 R reverse sort
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
23 H toggle threads
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
24 C,1 toggle SMP
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
25 Q,^C exit
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
26
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
27 Options
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
28 -n Iterations before exiting
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
29 -d Delay between updates
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
30 -m Same as 's' key
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
31 -b Batch mode
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
32 */
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
33
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
34 #define FOR_top
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
35 #include "toys.h"
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
36 #include <signal.h>
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
37 #include <poll.h>
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
38
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
39 GLOBALS(
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
40 long iterations;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
41 long delay;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
42
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
43 long cmp_field;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
44 long reverse;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
45 long rows;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
46 long smp;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
47 long threads;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
48 long m_flag;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
49 long num_new_procs;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
50 long scroll_offset;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
51 struct termios inf;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
52 )
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
53
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
54 #define PROC_NAME_LEN 512 //For long cmdline.
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
55 #define INIT_PROCS 50
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
56
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
57 struct cpu_info {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
58 long unsigned utime, ntime, stime, itime;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
59 long unsigned iowtime, irqtime, sirqtime, steal;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
60 unsigned long long total;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
61 };
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
62
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
63 enum CODE{
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
64 KEY_UP = 0x100, KEY_DOWN, KEY_HOME,
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
65 KEY_END, KEY_PAGEUP, KEY_PAGEDN,
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
66 };
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
67
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
68 struct keycode_map_s {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
69 char *key;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
70 int code;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
71 };
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
72
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
73 struct proc_info {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
74 struct proc_info *next;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
75 pid_t pid, ppid;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
76 uid_t uid;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
77 char name[PROC_NAME_LEN];
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
78 char tname[PROC_NAME_LEN];
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
79 char state[4];
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
80 int prs;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
81 unsigned long utime, stime, delta_utime, delta_stime, delta_time;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
82 unsigned long vss, vssrw, rss, rss_shr, drt, drt_shr, stack;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
83 };
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
84
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
85 static struct proc_info *free_procs, **old_procs, **new_procs;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
86 static struct cpu_info old_cpu[10], new_cpu[10]; //1 total, 8 cores, 1 null
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
87 static int (*proc_cmp)(const void *a, const void *b);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
88
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
89 static struct proc_info *find_old_proc(pid_t pid)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
90 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
91 int i;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
92
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
93 for (i = 0; old_procs && old_procs[i]; i++)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
94 if (old_procs[i]->pid == pid) return old_procs[i];
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
95
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
96 return NULL;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
97 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
98
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
99 static void read_stat(char *filename, struct proc_info *proc)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
100 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
101 int nice;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
102 FILE *file;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
103 char *open_paren, *close_paren;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
104
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
105 if (!(file = fopen(filename, "r"))) return;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
106 fgets(toybuf, sizeof(toybuf), file);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
107 fclose(file);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
108
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
109 // Split at first '(' and last ')' to get process name.
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
110 open_paren = strchr(toybuf, '(');
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
111 close_paren = strrchr(toybuf, ')');
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
112 if (!open_paren || !close_paren) return;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
113
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
114 *open_paren = *close_paren = '\0';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
115 snprintf(proc->tname, PROC_NAME_LEN, "[%s]",open_paren + 1);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
116
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
117 // Scan rest of string.
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
118 sscanf(close_paren + 1, " %c %d %*d %*d %*d %*d %*d %*d %*d %*d %*d "
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
119 "%lu %lu %*d %*d %*d %d %*d %*d %*d %lu %ld "
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
120 "%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %d",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
121 &proc->state[0], &proc->ppid, &proc->utime, &proc->stime, &nice,
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
122 &proc->vss, &proc->rss, &proc->prs);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
123 if (!proc->vss && proc->state[0] != 'Z') proc->state[1] = 'W';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
124 else proc->state[1] = ' ';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
125 if (nice < 0 ) proc->state[2] = '<';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
126 else if (nice) proc->state[2] = 'N';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
127 else proc->state[2] = ' ';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
128 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
129
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
130 static void read_status(char *filename, struct proc_info *proc)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
131 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
132 FILE *file;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
133
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
134 if (!(file = fopen(filename, "r"))) return;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
135 while (fgets(toybuf, sizeof(toybuf), file))
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
136 if (sscanf(toybuf, "Uid: %u", &(proc->uid)) == 1) break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
137
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
138 fclose(file);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
139 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
140
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
141 static void read_cmdline(char *filename, struct proc_info *proc)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
142 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
143 int fd, len, rbytes = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
144 char *ch, *base, tname[PROC_NAME_LEN];
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
145
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
146 if ((fd = open(filename, O_RDONLY)) == -1) return;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
147 rbytes = readall(fd, toybuf, sizeof(toybuf));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
148 close(fd);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
149 if (rbytes <= 0) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
150 strcpy(proc->name, proc->tname);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
151 return;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
152 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
153 toybuf[rbytes] = '\0';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
154 while (--rbytes >= 0 && toybuf[rbytes] == '\0') continue;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
155
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
156 snprintf(tname, PROC_NAME_LEN, "%s", proc->tname+1);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
157 tname[strlen(tname) - 1] = '\0';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
158 ch = strchr(toybuf, ' ');
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
159 if (ch) *ch = '\0';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
160 base = strrchr(toybuf, '/');
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
161 if (base) base++;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
162 else base = toybuf;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
163
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
164 for (; rbytes >= 0; rbytes--)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
165 if ((unsigned char)toybuf[rbytes] < ' ') toybuf[rbytes] = ' ';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
166
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
167 if (*base == '-') base++;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
168 len = strlen(tname);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
169 if (strncmp(base, tname, len)) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
170 len +=3; //{,}, \0
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
171 rbytes = strlen(toybuf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
172 memmove(toybuf+ len, toybuf, rbytes+1);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
173 snprintf(toybuf, sizeof(toybuf), "{%s}", tname);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
174 toybuf[len-1] = ' ';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
175 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
176 snprintf(proc->name, PROC_NAME_LEN, "%s", toybuf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
177 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
178
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
179 static void add_proc(int proc_num, struct proc_info *proc)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
180 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
181 int i;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
182
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
183 if (proc_num >= TT.num_new_procs-1) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
184 new_procs = xrealloc(new_procs, (INIT_PROCS + TT.num_new_procs)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
185 * sizeof(struct proc_info *));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
186 for (i = TT.num_new_procs; i < (INIT_PROCS + TT.num_new_procs); i++)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
187 new_procs[i] = NULL;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
188 TT.num_new_procs += INIT_PROCS;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
189 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
190 new_procs[proc_num] = proc;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
191 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
192
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
193 void signal_handler(int sig)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
194 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
195 tcsetattr(STDIN_FILENO, TCSANOW, &TT.inf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
196 xputc('\n');
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
197 signal(sig, SIG_DFL);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
198 raise(sig);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
199 _exit(sig | 128);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
200 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
201
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
202 static int get_key_code(char *ch, int i)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
203 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
204 static struct keycode_map_s type2[] = {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
205 {"OA",KEY_UP}, {"OB",KEY_DOWN}, {"OH",KEY_HOME},
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
206 {"OF",KEY_END}, {"[A",KEY_UP}, {"[B",KEY_DOWN},
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
207 {"[H",KEY_HOME}, {"[F",KEY_END}, {NULL, 0}
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
208 };
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
209
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
210 static struct keycode_map_s type3[] = {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
211 {"[1~", KEY_HOME}, {"[4~", KEY_END}, {"[5~", KEY_PAGEUP},
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
212 {"[6~", KEY_PAGEDN}, {"[7~", KEY_HOME}, {"[8~", KEY_END},
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
213 {NULL, 0}
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
214 };
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
215 struct keycode_map_s *table, *keytable[3] = {type2, type3, NULL};
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
216 int j;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
217
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
218 if ( i > 3 || i < 1) return -1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
219
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
220 for (j=0; (table = keytable[j]); j++) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
221 while (table->key) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
222 if (!strncmp(ch, table->key, i)) break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
223 table++;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
224 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
225 if (table->key) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
226 if (i == 1 || (i == 2 && j)) return 1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
227 return table->code;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
228 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
229 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
230 return -1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
231 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
232
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
233 static int read_input(int delay)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
234 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
235 struct pollfd pfd[1];
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
236 int ret, fret = 0, cnt = 0, escproc = 0, timeout = delay * 1000;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
237 char ch, seq[4] = {0,};
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
238 struct termios newf;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
239
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
240 tcgetattr(0, &TT.inf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
241 if (toys.optflags & FLAG_b) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
242 sleep(delay);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
243 return 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
244 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
245 pfd[0].fd = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
246 pfd[0].events = POLLIN;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
247
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
248 //prepare terminal for input, without Enter of Carriage return
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
249 memcpy(&newf, &TT.inf, sizeof(struct termios));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
250 newf.c_lflag &= ~(ICANON | ECHO | ECHONL);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
251 newf.c_cc[VMIN] = 1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
252 newf.c_cc[VTIME] = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
253 tcsetattr(0, TCSANOW, &newf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
254
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
255 while (1) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
256 if ((ret = poll(pfd, 1, timeout)) >= 0) break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
257 else {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
258 if (timeout > 0) timeout--;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
259 if (errno == EINTR) continue;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
260 perror_exit("poll");
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
261 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
262 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
263
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
264 while (ret) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
265 if (read(STDIN_FILENO, &ch, 1) != 1) toys.optflags |= FLAG_b;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
266 else if (ch == '\033' || escproc) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
267 int code;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
268 //process ESC keys
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
269 if (!escproc) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
270 if (!poll(pfd, 1, 50)) break; //no more chars
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
271 escproc = 1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
272 continue;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
273 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
274 seq[cnt++] = ch;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
275 code = get_key_code(seq, cnt);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
276 switch(code) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
277 case -1: //no match
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
278 fret = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
279 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
280 case 1: //read more
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
281 continue;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
282 default: // got the key
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
283 fret = code;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
284 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
285 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
286 } else if ((ch == TT.inf.c_cc[VINTR])
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
287 || (ch == TT.inf.c_cc[VEOF]))
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
288 fret = 'q';
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
289 else fret = ch | 0x20;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
290 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
291 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
292 tcsetattr(0, TCSANOW, &TT.inf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
293 return fret;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
294 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
295
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
296 // Allocation for Processes
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
297 static struct proc_info *alloc_proc(void)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
298 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
299 struct proc_info *proc;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
300
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
301 if (free_procs) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
302 proc = free_procs;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
303 free_procs = free_procs->next;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
304 memset(proc, 0, sizeof(*proc));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
305 } else proc = xzalloc(sizeof(*proc));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
306
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
307 return proc;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
308 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
309
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
310 static void free_proc_list(struct proc_info *procs)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
311 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
312 struct proc_info *tmp = procs;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
313
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
314 for (;tmp; tmp = procs) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
315 procs = procs->next;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
316 free(tmp);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
317 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
318 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
319
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
320 // Free allocated Processes in order to avoid memory leaks
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
321 static void free_proc(struct proc_info *proc)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
322 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
323 proc->next = free_procs;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
324 free_procs = proc;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
325 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
326
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
327 static struct proc_info *add_new_proc(pid_t pid, pid_t tid)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
328 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
329 char filename[64];
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
330 struct proc_info *proc = alloc_proc();
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
331
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
332 proc->pid = (tid)? tid : pid;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
333 if (!tid) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
334 sprintf(filename, "/proc/%d/stat", pid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
335 read_stat(filename, proc);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
336 sprintf(filename, "/proc/%d/cmdline", pid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
337 read_cmdline(filename, proc);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
338 sprintf(filename, "/proc/%d/status", pid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
339 read_status(filename, proc);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
340 } else{
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
341 sprintf(filename, "/proc/%d/task/%d/stat", pid,tid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
342 read_stat(filename, proc);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
343 sprintf(filename, "/proc/%d/task/%d/cmdline", pid, tid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
344 read_cmdline(filename, proc);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
345 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
346 return proc;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
347 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
348
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
349 static void read_smaps(pid_t pid, struct proc_info *p)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
350 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
351 FILE *fp;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
352 char *line;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
353 size_t len;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
354 long long start, end, val, prvcl, prvdr, shrdr, shrcl;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
355 int count;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
356
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
357 p->vss = p->rss = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
358 start = end = val = prvcl = prvdr = shrdr = shrcl = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
359 sprintf(toybuf, "/proc/%u/smaps", pid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
360 if (!(fp = fopen(toybuf, "r"))) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
361 error_msg("No %ld\n", (long)pid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
362 return;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
363 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
364 for (;;) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
365 int off;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
366
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
367 line = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
368 if (0 >= getline(&line, &len, fp)) break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
369 count = sscanf(line, "%llx-%llx %s %*s %*s %*s %n",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
370 &start, &end, toybuf, &off);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
371
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
372 if (count == 3) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
373 end = end - start;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
374 if (strncmp(line+off, "/dev/", 5) || !strcmp(line+off, "/dev/zero\n")) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
375 p->vss += end;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
376 if (toybuf[1] == 'w') p->vssrw += end;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
377 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
378 if (line[off] && !strncmp(line+off, "[stack]",7)) p->stack += end;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
379 } else {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
380 if (0<sscanf(line, "Private_Clean: %lld", &val)) prvcl += val;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
381 if (0<sscanf(line, "Private_Dirty: %lld", &val)) prvdr += val;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
382 if (0<sscanf(line, "Shared_Dirty: %lld", &val)) shrdr += val;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
383 if (0<sscanf(line, "Shared_Clean: %lld", &val)) shrcl += val;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
384 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
385 free(line);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
386 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
387 free(line); //incase it broke out.
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
388 p->rss_shr = shrdr + shrcl;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
389 p->drt = prvdr + shrdr;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
390 p->drt_shr = shrdr;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
391 p->rss = p->rss_shr + prvdr + prvcl;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
392 fclose(fp);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
393 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
394
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
395 static void read_procs(void) // Read Processes
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
396 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
397 DIR *proc_dir, *thr_dir;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
398 struct dirent *pid_dir, *t_dir;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
399 struct proc_info *proc;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
400 pid_t pid, tid;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
401 int proc_num = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
402
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
403 proc_dir = opendir("/proc");
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
404 if (!proc_dir) perror_exit("Could not open /proc");
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
405
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
406 new_procs = xzalloc(INIT_PROCS * sizeof(struct proc_info *));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
407 TT.num_new_procs = INIT_PROCS;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
408
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
409 while ((pid_dir = readdir(proc_dir))) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
410 if (!isdigit(pid_dir->d_name[0])) continue;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
411
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
412 pid = atoi(pid_dir->d_name);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
413 proc = add_new_proc(pid, 0);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
414 if (TT.m_flag) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
415 read_smaps(pid, proc);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
416 if (!proc->vss) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
417 free(proc);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
418 continue;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
419 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
420 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
421 add_proc(proc_num++, proc);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
422
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
423 if (TT.threads) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
424 char filename[64];
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
425 uid_t uid = proc->uid;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
426
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
427 sprintf(filename,"/proc/%d/task",pid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
428 if ((thr_dir = opendir(filename))) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
429 while ((t_dir = readdir(thr_dir))) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
430 if (!isdigit(t_dir->d_name[0])) continue;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
431
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
432 tid = atoi(t_dir->d_name);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
433 if (pid == tid) continue;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
434 proc = add_new_proc(pid, tid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
435 proc->uid = uid; //child will have same uid as parent.
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
436 add_proc(proc_num++, proc);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
437 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
438 closedir(thr_dir);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
439 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
440 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
441 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
442
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
443 closedir(proc_dir);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
444 TT.num_new_procs = proc_num;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
445 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
446
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
447 //calculate percentage.
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
448 static char* show_percent(long unsigned num, long unsigned den)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
449 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
450 long res;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
451 static char ch, buff[12]={'\0'};
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
452
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
453 if(num > den) num = den;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
454 res = (num * 100)/den;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
455 sprintf(buff,"%ld", (num * 100)% den);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
456 ch = *buff;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
457 sprintf(buff, "%ld.%c",res, ch);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
458 return buff;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
459 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
460
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
461 static int print_header(struct sysinfo *info, unsigned int cols)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
462 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
463 int fd, j, k, rows =0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
464 long unsigned total, meminfo_cached, anon, meminfo_mapped,
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
465 meminfo_slab, meminfo_dirty, meminfo_writeback, swapT, swapF;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
466 char *buff;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
467
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
468 fd = xopen("/proc/meminfo", O_RDONLY);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
469 while ((buff = get_line(fd))) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
470 if (!strncmp(buff, "Cached", 6))
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
471 sscanf(buff,"%*s %lu\n",&meminfo_cached);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
472 else if (!strncmp(buff, "AnonPages", 9))
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
473 sscanf(buff,"%*s %lu\n",&anon);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
474 else if (!strncmp(buff, "Mapped", 6))
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
475 sscanf(buff,"%*s %lu\n",&meminfo_mapped);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
476 else if (!strncmp(buff, "Slab", 4))
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
477 sscanf(buff,"%*s %lu\n",&meminfo_slab);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
478 else if (!strncmp(buff, "Dirty", 5))
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
479 sscanf(buff,"%*s %lu\n",&meminfo_dirty);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
480 else if (!strncmp(buff, "Writeback", 9))
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
481 sscanf(buff,"%*s %lu\n",&meminfo_writeback);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
482 else if (!strncmp(buff, "SwapTotal", 9))
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
483 sscanf(buff,"%*s %lu\n",&swapT);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
484 else if (!strncmp(buff, "SwapFree", 8))
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
485 sscanf(buff,"%*s %lu\n",&swapF);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
486 free(buff);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
487 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
488 close(fd);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
489
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
490 if (!(toys.optflags & FLAG_b)) printf("\033[H\033[J");
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
491
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
492 if (TT.m_flag){
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
493 sprintf(toybuf, "Mem total:%lu anon:%lu map:%lu free:%lu",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
494 ((info->totalram) >> 10), anon, meminfo_mapped,
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
495 ((info->freeram) >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
496 printf("%.*s\n", cols, toybuf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
497
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
498 sprintf(toybuf, "slab:%lu buf:%lu cache:%lu dirty:%lu write:%lu",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
499 meminfo_slab, ((info->bufferram) >>10), meminfo_cached,
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
500 meminfo_dirty,meminfo_writeback);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
501 printf("%.*s\n", cols, toybuf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
502
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
503 sprintf(toybuf, "Swap total:%lu free:%lu",swapT, swapF);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
504 printf("%.*s\n", cols, toybuf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
505 rows += 3;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
506 } else {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
507 sprintf(toybuf,"Mem: %luK used, %luK free, %luK shrd, %luK buff, %luK cached",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
508 (info->totalram-info->freeram) >>10, (info->freeram) >>10,
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
509 (info->sharedram) >>10, (info->bufferram) >>10, meminfo_cached);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
510 printf("%.*s\n", cols, toybuf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
511
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
512 for (k = 1; new_cpu[k].total; k++) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
513 j = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
514 if (!TT.smp) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
515 k = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
516 j = sprintf(toybuf,"CPU:");
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
517 } else j = sprintf(toybuf,"CPU%d:", k-1);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
518
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
519 total = (new_cpu[k].total) - (old_cpu[k].total);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
520 if (!total) total = 1; //avoid denominator as 0, FPE
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
521 j += sprintf(toybuf + j," %s%% usr",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
522 show_percent((new_cpu[k].utime - old_cpu[k].utime), total));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
523 j += sprintf(toybuf+j," %s%% sys",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
524 show_percent((new_cpu[k].stime - old_cpu[k].stime), total));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
525 j += sprintf(toybuf+j," %s%% nic",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
526 show_percent(new_cpu[k].ntime - old_cpu[k].ntime, total));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
527 j += sprintf(toybuf+j," %s%% idle",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
528 show_percent(new_cpu[k].itime - old_cpu[k].itime, total));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
529 j += sprintf(toybuf+j," %s%% io",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
530 show_percent((new_cpu[k].iowtime - old_cpu[k].iowtime), total));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
531 j += sprintf(toybuf+j," %s%% irq",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
532 show_percent(new_cpu[k].irqtime - old_cpu[k].irqtime, total));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
533 j += sprintf(toybuf+j," %s%% sirq",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
534 show_percent(new_cpu[k].sirqtime - old_cpu[k].sirqtime, total));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
535 printf("%.*s\n", cols, toybuf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
536 if (!TT.smp) break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
537 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
538
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
539 if ((buff = readfile("/proc/loadavg", NULL, 0))) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
540 buff[strlen(buff) -1] = '\0'; //removing '\n' at end
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
541 sprintf(toybuf, "Load average: %s", buff);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
542 printf("%.*s\n", cols, toybuf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
543 free(buff);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
544 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
545 rows += 2 + ((TT.smp) ? k-1 : 1);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
546 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
547 return rows;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
548 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
549
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
550 static void print_procs(void)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
551 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
552 int i, j = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
553 struct proc_info *old_proc, *proc;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
554 long unsigned total_delta_time;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
555 struct passwd *user;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
556 char *user_str, user_buf[20];
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
557 struct sysinfo info;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
558 unsigned int cols=0, rows =0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
559
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
560 terminal_size(&cols, &rows);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
561 if (!rows){
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
562 rows = 24; //on serial consoles setting default
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
563 cols = 79;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
564 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
565 if (toys.optflags & FLAG_b) rows = INT_MAX;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
566 TT.rows = rows;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
567
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
568 for (i = 0; i < TT.num_new_procs; i++) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
569 if (new_procs[i]) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
570 old_proc = find_old_proc(new_procs[i]->pid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
571 if (old_proc) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
572 new_procs[i]->delta_utime = new_procs[i]->utime - old_proc->utime;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
573 new_procs[i]->delta_stime = new_procs[i]->stime - old_proc->stime;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
574 } else {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
575 new_procs[i]->delta_utime = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
576 new_procs[i]->delta_stime = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
577 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
578 new_procs[i]->delta_time = new_procs[i]->delta_utime
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
579 + new_procs[i]->delta_stime;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
580 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
581 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
582
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
583 total_delta_time = new_cpu[0].total - old_cpu[0].total;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
584 if (!total_delta_time) total_delta_time = 1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
585
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
586 qsort(new_procs, TT.num_new_procs, sizeof(struct proc_info *), proc_cmp);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
587
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
588 //Memory details
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
589 sysinfo(&info);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
590 info.totalram *= info.mem_unit;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
591 info.freeram *= info.mem_unit;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
592 info.sharedram *= info.mem_unit;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
593 info.bufferram *= info.mem_unit;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
594
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
595 rows -= print_header(&info, cols);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
596
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
597 if (TT.m_flag) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
598 sprintf(toybuf, "%5s %5s %5s %5s %5s %5s %5s %5s %s", "PID", "VSZ", "VSZRW",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
599 "RSS", "(SHR)", "DIRTY", "(SHR)", "STACK", "COMMAND");
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
600 toybuf[11 + TT.cmp_field*6] = (TT.reverse)?'_':'^'; //11 for PID,VSZ fields
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
601 } else sprintf(toybuf, "%5s %5s %-8s %4s %5s %5s %4s %5s %s", "PID", "PPID",
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
602 "USER", "STAT", "VSZ", "%VSZ", "CPU" , "%CPU", "COMMAND");
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
603
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
604 printf((toys.optflags & FLAG_b)?"%.*s\n":"\033[7m%.*s\033[0m\n",cols, toybuf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
605 rows--;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
606 for (i = TT.scroll_offset; i < TT.num_new_procs; i++) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
607 j = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
608 proc = new_procs[i];
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
609
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
610 user = getpwuid(proc->uid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
611 if (user && user->pw_name) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
612 user_str = user->pw_name;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
613 } else {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
614 snprintf(user_buf, 20, "%d", proc->uid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
615 user_str = user_buf;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
616 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
617
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
618 if (!TT.m_flag )
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
619 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
620 float vss_percentage = (float)(proc->vss)/info.totalram * 100;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
621
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
622 j = sprintf(toybuf, "%5d %5d %-8.8s %-4s",proc->pid, proc->ppid, user_str,
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
623 proc->state);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
624
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
625 if ((proc->vss >> 10) >= 100000)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
626 j += sprintf(toybuf + j, " %4lum", ((proc->vss >> 10) >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
627 else j += sprintf(toybuf+j, " %5lu", (proc->vss >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
628
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
629 sprintf(toybuf + j," %5.1f %4d %5s %s", vss_percentage, proc->prs,
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
630 show_percent(proc->delta_time, total_delta_time),
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
631 ((proc->name[0])? proc->name : proc->tname));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
632 printf("%.*s", cols, toybuf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
633 } else {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
634 j = sprintf(toybuf, "%5d",proc->pid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
635
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
636 if ((proc->vss >> 10) >= 100000)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
637 j += sprintf(toybuf + j, " %4lum", ((proc->vss >> 10) >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
638 else j += sprintf(toybuf+j, " %5lu", (proc->vss >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
639 if ((proc->vssrw >>10) >= 100000)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
640 j += sprintf(toybuf + j, " %4lum", ((proc->vssrw >> 10) >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
641 else j += sprintf(toybuf+j, " %5lu", (proc->vssrw >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
642 if (proc->rss >= 100000)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
643 j += sprintf(toybuf + j, " %4lum", ((proc->rss >> 10)));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
644 else j += sprintf(toybuf+j, " %5lu", proc->rss);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
645 if (proc->rss_shr >= 100000)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
646 j += sprintf(toybuf + j, " %4lum", (proc->rss_shr >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
647 else j += sprintf(toybuf+j, " %5lu", proc->rss_shr);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
648 if (proc->drt >= 100000)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
649 j += sprintf(toybuf + j, " %4lum", (proc->drt >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
650 else j += sprintf(toybuf+j, " %5lu", proc->drt);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
651 if (proc->drt_shr >= 100000)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
652 j += sprintf(toybuf + j, " %4lum", (proc->drt_shr >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
653 else j += sprintf(toybuf+j, " %5lu", proc->drt_shr);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
654 if ((proc->stack >>10) >= 100000)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
655 j += sprintf(toybuf + j, " %4lum", ((proc->stack >> 10) >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
656 else j += sprintf(toybuf+j, " %5lu", (proc->stack >> 10));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
657
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
658 sprintf(toybuf + j," %s",((proc->name[0])? proc->name : proc->tname));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
659 printf("%.*s", cols, toybuf);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
660 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
661 rows--;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
662 if (!rows) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
663 xputc('\r');
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
664 break; //don't print any more process details.
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
665 } else xputc('\n');
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
666 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
667 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
668
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
669 /*
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
670 * Free old processes(displayed in old iteration) in order to
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
671 * avoid memory leaks
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
672 */
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
673 static void free_procs_arr(struct proc_info **procs)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
674 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
675 int i;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
676 for (i = 0; procs && procs[i]; i++)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
677 free_proc(procs[i]);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
678
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
679 free(procs);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
680 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
681
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
682 static int numcmp(long long a, long long b)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
683 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
684 if (a < b) return (TT.reverse)?-1 : 1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
685 if (a > b) return (TT.reverse)?1 : -1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
686 return 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
687 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
688
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
689 static int top_mem_cmp(const void *a, const void *b)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
690 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
691 char *pa, *pb;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
692
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
693 int n = offsetof(struct proc_info, vss) + TT.cmp_field * sizeof(unsigned long);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
694 pa = *((char **)a); pb = *((char **)b);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
695 return numcmp(*(unsigned long*)(pa+n), *(unsigned long*)(pb+n));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
696 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
697
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
698 static int proc_time_cmp(const void *a, const void *b)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
699 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
700 struct proc_info *pa, *pb;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
701
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
702 pa = *((struct proc_info **)a); pb = *((struct proc_info **)b);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
703 return numcmp(pa->utime + pa->stime, pb->utime+pa->stime);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
704 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
705
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
706 /*
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
707 * Function to compare CPU usgae % while displaying processes
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
708 * according to CPU usage
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
709 */
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
710 static int proc_cpu_cmp(const void *a, const void *b)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
711 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
712 struct proc_info *pa, *pb;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
713
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
714 pa = *((struct proc_info **)a); pb = *((struct proc_info **)b);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
715 return numcmp(pa->delta_time, pb->delta_time);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
716 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
717
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
718 /*
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
719 * Function to compare memory taking by a process at the time of
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
720 * displaying processes according to Memory usage
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
721 */
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
722 static int proc_vss_cmp(const void *a, const void *b)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
723 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
724 struct proc_info *pa, *pb;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
725
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
726 pa = *((struct proc_info **)a); pb = *((struct proc_info **)b);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
727 return numcmp(pa->vss, pb->vss);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
728 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
729
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
730 static int proc_pid_cmp(const void *a, const void *b)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
731 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
732 struct proc_info *pa, *pb;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
733
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
734 pa = *((struct proc_info **)a); pb = *((struct proc_info **)b);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
735 return numcmp(pa->pid, pb->pid);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
736 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
737
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
738 /* Read CPU stats for all the cores, assuming max 8 cores
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
739 * to be present here.
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
740 */
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
741 static void read_cpu_stat()
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
742 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
743 int i;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
744 size_t len;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
745 char *line = 0, *params = "%lu %lu %lu %lu %lu %lu %lu %lu";
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
746 FILE *fp = xfopen("/proc/stat", "r");
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
747
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
748 for (i = 0; i<=8 && getline(&line, &len, fp) > 0; i++) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
749 if (i) sprintf(toybuf, "cpu%d %s", i-1, params);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
750 else sprintf(toybuf, "cpu %s", params);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
751 len = sscanf(line, toybuf, &new_cpu[i].utime, &new_cpu[i].ntime,
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
752 &new_cpu[i].stime, &new_cpu[i].itime, &new_cpu[i].iowtime,
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
753 &new_cpu[i].irqtime, &new_cpu[i].sirqtime, &new_cpu[i].steal);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
754 if (len == 8)
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
755 new_cpu[i].total = new_cpu[i].utime + new_cpu[i].ntime + new_cpu[i].stime
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
756 + new_cpu[i].itime + new_cpu[i].iowtime + new_cpu[i].irqtime
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
757 + new_cpu[i].sirqtime + new_cpu[i].steal;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
758
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
759 free(line);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
760 line = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
761 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
762 fclose(fp);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
763 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
764
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
765 void top_main(void )
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
766 {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
767 int get_key;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
768
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
769 proc_cmp = &proc_cpu_cmp;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
770 if ( TT.delay < 0) TT.delay = 3;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
771 if (toys.optflags & FLAG_m) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
772 proc_cmp = &top_mem_cmp;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
773 TT.m_flag = 1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
774 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
775
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
776 sigatexit(signal_handler);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
777 read_cpu_stat();
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
778 get_key = read_input(0);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
779
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
780 while (!(toys.optflags & FLAG_n) || TT.iterations--) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
781 old_procs = new_procs;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
782 memcpy(old_cpu, new_cpu, sizeof(old_cpu));
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
783 read_procs();
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
784 read_cpu_stat();
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
785 print_procs();
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
786 free_procs_arr(old_procs);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
787 if ((toys.optflags & FLAG_n) && !TT.iterations) break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
788
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
789 get_key = read_input(TT.delay);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
790 if (get_key == 'q') break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
791
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
792 switch(get_key) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
793 case 'n':
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
794 proc_cmp = &proc_pid_cmp;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
795 TT.m_flag = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
796 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
797 case 'h':
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
798 if (!TT.m_flag) TT.threads ^= 1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
799 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
800 case 'm':
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
801 proc_cmp = &proc_vss_cmp;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
802 TT.m_flag = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
803 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
804 case 'r':
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
805 TT.reverse ^= 1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
806 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
807 case 'c':
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
808 case '1':
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
809 TT.smp ^= 1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
810 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
811 case 's':
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
812 TT.m_flag = 1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
813 TT.cmp_field = (TT.cmp_field + 1) % 7;//7 sort fields, vss,vssrw...
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
814 proc_cmp = &top_mem_cmp;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
815 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
816 case 'p':
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
817 proc_cmp = &proc_cpu_cmp;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
818 TT.m_flag = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
819 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
820 case 't':
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
821 proc_cmp = &proc_time_cmp;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
822 TT.m_flag = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
823 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
824 case KEY_UP:
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
825 TT.scroll_offset--;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
826 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
827 case KEY_DOWN:
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
828 TT.scroll_offset++;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
829 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
830 case KEY_HOME:
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
831 TT.scroll_offset = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
832 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
833 case KEY_END:
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
834 TT.scroll_offset = TT.num_new_procs - TT.rows/2;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
835 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
836 case KEY_PAGEUP:
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
837 TT.scroll_offset -= TT.rows/2;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
838 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
839 case KEY_PAGEDN:
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
840 TT.scroll_offset += TT.rows/2;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
841 break;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
842 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
843 if (TT.scroll_offset >= TT.num_new_procs) TT.scroll_offset = TT.num_new_procs-1;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
844 if (TT.scroll_offset < 0) TT.scroll_offset = 0;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
845 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
846 xputc('\n');
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
847 if (CFG_TOYBOX_FREE) {
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
848 free_proc_list(free_procs);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
849 free_procs = NULL;
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
850 free_procs_arr(new_procs);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
851 free_proc_list(free_procs);
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
852 }
f4f543ff8490 top submitted by Ashwini Sharma
Rob Landley <rob@landley.net>
parents:
diff changeset
853 }