⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
#/* *	ps - process status *	examine and print certain things about processes */#include "/usr/sys/param.h"#include "/usr/sys/proc.h"#include "/usr/sys/tty.h"#include "/usr/sys/user.h"struct {	char name[8];	int  type;	char  *value;} nl[3];struct proc proc[NPROC];struct tty tty;struct user u;int	lflg;int	kflg;int	xflg;int	tflg;int	aflg;int	mem;int	swap;int	stbuf[257];int	ndev;char	devc[65];int	devl[65];int	devt[65];char	*coref;struct ibuf {	char	idevmin, idevmaj;	int	inum;	int	iflags;	char	inl;	char	iuid;	char	igid;	char	isize0;	int	isize;	int	iaddr[8];	char	*ictime[2];	char	*imtime[2];	int	fill;};int	obuf[259];main(argc, argv)char **argv;{	struct proc *p;	int n, b;	int i, c, mtty;	char *ap;	int uid, puid;	obuf[0] = 1;	if (argc>1) {		ap = argv[1];		while (*ap) switch (*ap++) {		case 'a':			aflg++;			break;		case 't':			tflg++;			break;		case 'x':			xflg++;			break;		case 'l':			lflg++;			break;		case 'k':			kflg++;			break;		}	}	if(chdir("/dev") < 0) {		printf("cannot change to /dev\n");		done();	}	setup(&nl[0], "_proc");	setup(&nl[1], "_swapdev");	nlist(argc>2? argv[2]:"/unix", nl);	if (nl[0].type==0) {		printf("No namelist\n");		return;	}	coref = "/dev/mem";	if(kflg)		coref = "/usr/sys/core";	if ((mem = open(coref, 0)) < 0) {		printf("No mem\n");		done();	}	seek(mem, nl[1].value, 0);	read(mem, &nl[1].value, 2);	seek(mem, nl[0].value, 0);	read(mem, proc, sizeof proc);	getdev();	mtty = ttyn(0);	uid = getuid() & 0377;	if(lflg)	printf("TTY F S UID   PID PRI ADDR  SZ  WCHAN COMMAND\n"); else		printf("TTY  PID COMMAND\n");	for (i=0; i<NPROC; i++) {		if (proc[i].p_stat==0)			continue;		if (proc[i].p_ttyp==0) {			if (xflg==0)				continue;			c = '?';		} else {			for(c=0; c<ndev; c++)			if(devt[c] == proc[i].p_ttyp) {				c = devc[c];				goto out;			}			seek(mem, proc[i].p_ttyp, 0);			read(mem, &tty, sizeof tty);			for(c=0; c<ndev; c++)			if(devl[c] == tty.t_dev) {				devt[c] = proc[i].p_ttyp;				c = devc[c];				goto out;			}			c = '?';		out:;		}		puid = proc[i].p_uid & 0377;		if (uid != puid && aflg==0)			continue;		if (lflg || c!=mtty)			printf("%c:", c);		else			printf("  ");		if (lflg) {			printf("%3o %c%4d", proc[i].p_flag,				"0SWRIZT"[proc[i].p_stat], puid);		}		printf("%6l", proc[i].p_pid);		if (lflg) {			printf("%4d%5o%4d", proc[i].p_pri, proc[i].p_addr,				(proc[i].p_size+7)>>3);			if (proc[i].p_wchan)				printf("%7o", proc[i].p_wchan); else				printf("       ");		}		if (proc[i].p_stat==5)			printf(" <defunct>");		else			prcom(i);		printf("\n");	}	done();}getdev(){	register struct { int dir_ino; char dir_n[14]; } *p;	register i, c;	int f;	char dbuf[512];	int sbuf[20];	f = open("/dev");	if(f < 0) {		printf("cannot open /dev\n");		done();	}	swap = -1;	c = 0;loop:	i = read(f, dbuf, 512);	if(i <= 0) {		close(f);		if(swap < 0) {			printf("no swap device\n");			done();		}		ndev = c;		return;	}	while(i < 512)		dbuf[i++] = 0;	for(p = dbuf; p < dbuf+512; p++) {		if(p->dir_ino == 0)			continue;		if(p->dir_n[0] == 't' &&		   p->dir_n[1] == 't' &&		   p->dir_n[2] == 'y' &&		   p->dir_n[4] == 0 &&		   p->dir_n[3] != 0) {			if(stat(p->dir_n, sbuf) < 0)				continue;			devc[c] = p->dir_n[3];			devl[c] = sbuf->iaddr[0];			c++;			continue;		}		if(swap >= 0)			continue;		if(stat(p->dir_n, sbuf) < 0)			continue;		if((sbuf->iflags & 060000) != 060000)			continue;		if(sbuf->iaddr[0] == nl[1].value)			swap = open(p->dir_n, 0);	}	goto loop;}setup(p, s)char *p, *s;{	while (*p++ = *s++);}prcom(i){	int baddr, laddr, mf;	register int *ip;	register char *cp, *cp1;	int c, nbad;	baddr = 0;	laddr = 0;	if (proc[i].p_flag&SLOAD) {		laddr = proc[i].p_addr;		mf = mem;	} else {		baddr = proc[i].p_addr;		mf = swap;	}	laddr =+ proc[i].p_size - 8;	baddr =+ laddr>>3;	laddr = (laddr&07)<<6;	seek(mf, baddr, 3);	seek(mf, laddr, 1);	if (read(mf, stbuf, 512) != 512)		return(0);	for (ip = &stbuf[256]; ip > &stbuf[0];) {		if (*--ip == -1) {			cp = ip+1;			if (*cp==0)				cp++;			nbad = 0;			for (cp1 = cp; cp1 < &stbuf[256]; cp1++) {				c = *cp1;				if (c==0)					*cp1 = ' ';				else if (c < ' ' || c > 0176) {					if (++nbad >= 5) {						*cp1++ = ' ';						break;					}					*cp1 = '?';				}			}			while (*--cp1==' ')				*cp1 = 0;			printf(lflg?" %.16s":" %.64s", cp);			return(1);		}	}	return(0);}done(){	fflush(obuf);	exit();}putchar(c){	putc(c, obuf);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -