172 lines · 3.1 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #include <u.h>#include <libc.h>#include <bio.h> void	ps(char*);void	error(char*);int	cmp(void*, void*); Biobuf	bout;int	pflag;int	aflag;int	rflag; voidmain(int argc, char *argv[]){	int fd, i, tot, none = 1;	Dir *dir, **mem;  	ARGBEGIN {	case 'a':		aflag++;		break;	case 'p':		pflag++;		break;	case 'r':		rflag++;		break;	} ARGEND;	Binit(&bout, 1, OWRITE);	if(chdir("/proc")==-1)		error("/proc");	fd=open(".", OREAD);	if(fd<0)		error("/proc");	tot = dirreadall(fd, &dir);	if(tot <= 0){		fprint(2, "ps: empty directory /proc\n");		exits("empty");	}	mem = malloc(tot*sizeof(Dir*));	for(i=0; i<tot; i++)		mem[i] = dir++; 	qsort(mem, tot, sizeof(Dir*), cmp);	for(i=0; i<tot; i++){		ps(mem[i]->name);		none = 0;	} 	if(none)		error("no processes; bad #p");	exits(0);} voidps(char *s){	ulong utime, stime, rtime, size;	int argc, basepri, fd, i, n, pri;	char args[256], *argv[16], buf[64], pbuf[8], rbuf[20], rbuf1[20], status[4096]; 	sprint(buf, "%s/status", s);	fd = open(buf, OREAD);	if(fd<0)		return;	n = read(fd, status, sizeof status-1);	close(fd);	if(n <= 0)		return;	status[n] = '\0'; 	if((argc = tokenize(status, argv, nelem(argv)-1)) < 12)		return;	argv[argc] = 0; 	/*	 * 0  text	 * 1  user	 * 2  state	 * 3  cputime[6]	 * 9  memory	 * 10 basepri	 * 11 pri	 */	utime = strtoul(argv[3], 0, 0)/1000;	stime = strtoul(argv[4], 0, 0)/1000;	rtime = strtoul(argv[5], 0, 0)/1000;	size  = strtoul(argv[9], 0, 0);	if(pflag){		basepri = strtoul(argv[10], 0, 0);		pri = strtoul(argv[11], 0, 0);		sprint(pbuf, " %2d %2d", basepri, pri);	} else		pbuf[0] = 0; 	if(rflag){		if(rtime >= 86400)			sprint(rbuf, " %lud:%02lud:%02lud:%02lud", rtime/86400, (rtime/3600)%24, (rtime/60)%60, rtime%60);		else if(rtime >= 3600)			sprint(rbuf, " %lud:%02lud:%02lud", rtime/3600, (rtime/60)%60, rtime%60);		else			sprint(rbuf, " %lud:%02lud", rtime/60, rtime%60);		sprint(rbuf1, "%12s", rbuf);	}else		rbuf1[0] = 0; 	Bprint(&bout, "%-10s %8s%s %4lud:%.2lud %3lud:%.2lud %s %7ludK %-8.8s ",			argv[1],			s,			rbuf1,			utime/60, utime%60,			stime/60, stime%60,			pbuf,			size,			argv[2]); 	if(aflag == 0){    Noargs:		Bprint(&bout, "%s\n", argv[0]);		return;	} 	sprint(buf, "%s/args", s);	fd = open(buf, OREAD);	if(fd < 0)		goto Badargs;	n = read(fd, args, sizeof args-1);	close(fd);	if(n < 0)		goto Badargs;	if(n == 0)		goto Noargs;	args[n] = '\0';	for(i=0; i<n; i++)		if(args[i] == '\n')			args[i] = ' ';	Bprint(&bout, "%s\n", args);	return;     Badargs:	Bprint(&bout, "%s ?\n", argv[0]);} voiderror(char *s){	fprint(2, "ps: %s: ", s);	perror("error");	exits(s);} intcmp(void *va, void *vb){	Dir **a, **b; 	a = va;	b = vb;	return atoi((*a)->name) - atoi((*b)->name);}