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

📄 ps.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
/* *	ps - process status *	examine and print certain things about processes */#include <stdio.h>#include <a.out.h>#include <core.h>#include <sys/param.h>#include <sys/proc.h>#include <sys/tty.h>#include <sys/dir.h>#include <sys/user.h>struct nlist nl[] = {	{ "_proc" },	{ "_swapdev" },	{ "_swplo" },	{ "" },};struct	proc mproc;struct	user u;int	chkpid;int	retcode=1;int	lflg;int	vflg;int	kflg;int	xflg;char	*tptr;long	lseek();char	*gettty();char	*getptr();char	*strncmp();int	aflg;int	mem;int	swmem;int	swap;daddr_t	swplo;int	ndev;struct devl {	char	dname[DIRSIZ];	dev_t	dev;} devl[256];char	*coref;main(argc, argv)char **argv;{	int i;	char *ap;	int uid, puid;	if (argc>1) {		ap = argv[1];		while (*ap) switch (*ap++) {		case 'v':			vflg++;			break;		case 'a':			aflg++;			break;		case 't':			if(*ap)				tptr = ap;			aflg++;			if (*tptr == '?')				xflg++;			goto bbreak;		case 'x':			xflg++;			break;		case '-':			break;		case 'l':			lflg++;			break;		case 'k':			kflg++;			break;		default:			chkpid = atoi(ap-1);			goto bbreak;			break;		}	}bbreak:	if(chdir("/dev") < 0) {		fprintf(stderr, "Can't change to /dev\n");		exit(1);	}	nlist(argc>2? argv[2]:"/unix", nl);	if (nl[0].n_type==0) {		fprintf(stderr, "No namelist\n");		exit(1);	}	coref = "/dev/mem";	if(kflg)		coref = "/usr/sys/core";	if ((mem = open(coref, 0)) < 0) {		fprintf(stderr, "No mem\n");		exit(1);	}	swmem = open(coref, 0);	/*	 * read mem to find swap dev.	 */	lseek(mem, (long)nl[1].n_value, 0);	read(mem, (char *)&nl[1].n_value, sizeof(nl[1].n_value));	/*	 * Find base of swap	 */	lseek(mem, (long)nl[2].n_value, 0);	read(mem, (char *)&swplo, sizeof(swplo));	/*	 * Locate proc table	 */	lseek(mem, (long)nl[0].n_value, 0);	getdev();	uid = getuid();	if (lflg)	printf(" F S UID   PID  PPID CPU PRI NICE  ADDR  SZ  WCHAN TTY TIME CMD\n"); else		if (chkpid==0) printf("   PID TTY TIME CMD\n");	for (i=0; i<NPROC; i++) {		read(mem, (char *)&mproc, sizeof mproc);		if (mproc.p_stat==0)			continue;		if (mproc.p_pgrp==0 && xflg==0 && mproc.p_uid==0)			continue;		puid = mproc.p_uid;		if ((uid != puid && aflg==0) ||		    (chkpid!=0 && chkpid!=mproc.p_pid))			continue;		if(prcom(puid)) {			printf("\n");			retcode=0;		}	}	exit(retcode);}getdev(){#include <sys/stat.h>	register FILE *df;	struct stat sbuf;	struct direct dbuf;	if ((df = fopen("/dev", "r")) == NULL) {		fprintf(stderr, "Can't open /dev\n");		exit(1);	}	ndev = 0;	while (fread((char *)&dbuf, sizeof(dbuf), 1, df) == 1) {		if(dbuf.d_ino == 0)			continue;		if(stat(dbuf.d_name, &sbuf) < 0)			continue;		if ((sbuf.st_mode&S_IFMT) != S_IFCHR)			continue;		strcpy(devl[ndev].dname, dbuf.d_name);		devl[ndev].dev = sbuf.st_rdev;		ndev++;	}	fclose(df);	if ((swap = open("/dev/swap", 0)) < 0) {		fprintf(stderr, "Can't open /dev/swap\n");		exit(1);	}}longround(a, b)	long		a, b;{	long		w = ((a+b-1)/b)*b;	return(w);}struct map {	long	b1, e1; long f1;	long	b2, e2; long f2;};struct map datmap;int	file;prcom(puid){	char abuf[512];	long addr;	register int *ip;	register char *cp, *cp1;	long tm;	int c, nbad;	register char *tp;	long txtsiz, datsiz, stksiz;	int septxt;	int lw=(lflg?35:80);	char **ap;	if (mproc.p_flag&SLOAD) {		addr = ctob((long)mproc.p_addr);		file = swmem;	} else {		addr = (mproc.p_addr+swplo)<<9;		file = swap;	}	lseek(file, addr, 0);	if (read(file, (char *)&u, sizeof(u)) != sizeof(u))		return(0);	/* set up address maps for user pcs */	txtsiz = ctob(u.u_tsize);	datsiz = ctob(u.u_dsize);	stksiz = ctob(u.u_ssize);	septxt = u.u_sep;	datmap.b1 = (septxt ? 0 : round(txtsiz,TXTRNDSIZ));	datmap.e1 = datmap.b1+datsiz;	datmap.f1 = ctob(USIZE)+addr;	datmap.b2 = stackbas(stksiz);	datmap.e2 = stacktop(stksiz);	datmap.f2 = ctob(USIZE)+(datmap.e1-datmap.b1)+addr;	tp = gettty();	if (tptr && strncmp(tptr, tp, 2))		return(0);	if (lflg) {		printf("%2o %c%4d", mproc.p_flag,			"0SWRIZT"[mproc.p_stat], puid);	}	printf("%6u", mproc.p_pid);	if (lflg) {		printf("%6u%4d%4d%5d%6o%4d", mproc.p_ppid, mproc.p_cpu&0377,			mproc.p_pri,			mproc.p_nice,			mproc.p_addr, (mproc.p_size+7)>>3);		if (mproc.p_wchan)			printf("%7o", mproc.p_wchan);		else			printf("       ");	}	printf(" %-2.2s", tp);	if (mproc.p_stat==SZOMB) {		printf("  <defunct>");		return(1);	}	tm = (u.u_utime + u.u_stime + 30)/60;	printf(" %2ld:", tm/60);	tm %= 60;	printf(tm<10?"0%ld":"%ld", tm);	if (vflg && lflg==0) {	/* 0 == old tflg (print long times) */		tm = (u.u_cstime + 30)/60;		printf(" %2ld:", tm/60);		tm %= 60;		printf(tm<10?"0%ld":"%ld", tm);		tm = (u.u_cutime + 30)/60;		printf(" %2ld:", tm/60);		tm %= 60;		printf(tm<10?"0%ld":"%ld", tm);	}	if (mproc.p_pid == 0) {		printf(" swapper");		return(1);	}	addr += ctob((long)mproc.p_size) - 512;	/* look for sh special */	lseek(file, addr+512-sizeof(char **), 0);	if (read(file, (char *)&ap, sizeof(char *)) != sizeof(char *))		return(1);	if (ap) {		char b[82];		char *bp = b;		while((cp=getptr(ap++)) && cp && (bp<b+lw) ) {			nbad = 0;			while((c=getbyte(cp++)) && (bp<b+lw)) {				if (c<' ' || c>'~') {					if (nbad++>3)						break;					continue;				}				*bp++ = c;			}			*bp++ = ' ';		}		*bp++ = 0;		printf(lflg?" %.30s":" %.60s", b);		return(1);	}	lseek(file, addr, 0);	if (read(file, abuf, sizeof(abuf)) != sizeof(abuf))		return(1);	for (ip = (int *)&abuf[512]-2; ip > (int *)abuf; ) {		if (*--ip == -1 || *ip==0) {			cp = (char *)(ip+1);			if (*cp==0)				cp++;			nbad = 0;			for (cp1 = cp; cp1 < &abuf[512]; cp1++) {				c = *cp1&0177;				if (c==0)					*cp1 = ' ';				else if (c < ' ' || c > 0176) {					if (++nbad >= 5) {						*cp1++ = ' ';						break;					}					*cp1 = '?';				} else if (c=='=') {					*cp1 = 0;					while (cp1>cp && *--cp1!=' ')						*cp1 = 0;					break;				}			}			while (*--cp1==' ')				*cp1 = 0;			printf(lflg?" %.30s":" %.60s", cp);			return(1);		}	}	return(1);}char *gettty(){	register i;	register char *p;	if (u.u_ttyp==0)		return("?");	for (i=0; i<ndev; i++) {		if (devl[i].dev == u.u_ttyd) {			p = devl[i].dname;			if (p[0]=='t' && p[1]=='t' && p[2]=='y')				p += 3;			return(p);		}	}	return("?");}char *getptr(adr)char **adr;{	char *ptr;	register char *p, *pa;	register i;	ptr = 0;	pa = (char *)adr;	p = (char *)&ptr;	for (i=0; i<sizeof(ptr); i++)		*p++ = getbyte(pa++);	return(ptr);}getbyte(adr)char *adr;{	register struct map *amap = &datmap;	char b;	long saddr;	if(!within(adr, amap->b1, amap->e1)) {		if(within(adr, amap->b2, amap->e2)) {			saddr = (unsigned)adr + amap->f2 - amap->b2;		} else			return(0);	} else		saddr = (unsigned)adr + amap->f1 - amap->b1;	if(lseek(file, saddr, 0)==-1		   || read(file, &b, 1)<1) {		return(0);	}	return((unsigned)b);}within(adr,lbd,ubd)char *adr;long lbd, ubd;{	return((unsigned)adr>=lbd && (unsigned)adr<ubd);}

⌨️ 快捷键说明

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