4 enum { NBUCKETS = 1024 };
6 typedef struct Proc Proc;
7 typedef struct Bucket Bucket;
11 Proc *first, *last, *parent, *next;
24 for(p = buck[pid % NBUCKETS].first; p; p = p->bnext)
37 p = mallocz(sizeof(*p), 1);
39 sysfatal("malloc: %r");
41 b = buck + pid % NBUCKETS;
57 file = smprint("/proc/%d/ppid", pid);
58 fd = open(file, OREAD);
63 if(read(fd, buf, sizeof buf) >= 0)
94 fd = open("/proc", OREAD);
97 rc = dirreadall(fd, &d);
99 sysfatal("dirreadall: %r");
101 for(i = 0; i < rc; i++)
102 if(d[i].mode & DMDIR)
103 addproc(atoi(d[i].name));
104 for(i = 0; i < rc; i++)
105 if(d[i].mode & DMDIR)
106 addppid(atoi(d[i].name));
118 fd = open(file, OREAD);
123 while(rc = read(fd, b, 512), rc > 0) {
140 if(readout(smprint("/proc/%d/args", pid)) > 0)
142 file = smprint("/proc/%d/status", pid);
143 fd = open(file, OREAD);
147 memset(b, 0, sizeof b);
148 if(read(fd, b, 27) <= 0)
150 p = b + strlen(b) - 1;
158 descend(Proc *p, Rune *r)
164 *r = last == L' ' ? L'└' : L'├';
167 print(" [%d]\n", p->pid);
170 for(q = p->first; q; q = q->next) {
181 descend(getproc(0), buf);