1implement Ps; 2 3include "sys.m"; 4include "draw.m"; 5 6FD, Dir: import Sys; 7Context: import Draw; 8 9Ps: module 10{ 11 init: fn(ctxt: ref Context, argv: list of string); 12}; 13 14sys: Sys; 15stderr: ref FD; 16 17init(nil: ref Context, nil: list of string) 18{ 19 sys = load Sys Sys->PATH; 20 21 stderr = sys->fildes(2); 22 23 sys->pctl(Sys->FORKNS, nil); 24 if(sys->chdir("/prog") < 0){ 25 sys->fprint(stderr, "ps: can't chdir to /prog: %r\n"); 26 raise "fail:no /prog"; 27 } 28 fd := sys->open(".", sys->OREAD); 29 if(fd == nil) { 30 sys->fprint(stderr, "ps: cannot open /prog: %r\n"); 31 raise "fail:no /prog"; 32 } 33 34 for(;;) { 35 (n, d) := sys->dirread(fd); 36 if(n <= 0){ 37 if(n < 0) { 38 sys->fprint(stderr, "ps: error reading /prog: %r\n"); 39 raise "fail:error on /prog"; 40 } 41 break; 42 } 43 for(i := 0; i < n; i++) 44 if(d[i].name[0] >= '0' && d[i].name[0] <= '9') 45 ps(int d[i].name); 46 } 47} 48 49ps(pid: int) 50{ 51 proc := string pid+"/status"; 52 fd := sys->open(proc, sys->OREAD); 53 if(fd == nil) { # process must have died 54 # sys->fprint(stderr, "ps: /prog/%s: %r\n", proc); 55 return; 56 } 57 buf := array[128] of byte; 58 n := sys->read(fd, buf, len buf); 59 if(n > 0) 60 sys->print("%s\n", string buf[0:n]); 61} 62