xref: /csrg-svn/sys/kern/kern_proc.c (revision 17091)
1*17091Sbloom /*	kern_proc.c	6.4	84/08/29	*/
236Sbill 
39753Ssam #include "../machine/reg.h"
49753Ssam #include "../machine/pte.h"
59753Ssam #include "../machine/psl.h"
69753Ssam 
7*17091Sbloom #include "param.h"
8*17091Sbloom #include "systm.h"
9*17091Sbloom #include "map.h"
10*17091Sbloom #include "dir.h"
11*17091Sbloom #include "user.h"
12*17091Sbloom #include "kernel.h"
13*17091Sbloom #include "proc.h"
14*17091Sbloom #include "buf.h"
15*17091Sbloom #include "inode.h"
16*17091Sbloom #include "seg.h"
17*17091Sbloom #include "acct.h"
18*17091Sbloom #include "wait.h"
19*17091Sbloom #include "vm.h"
20*17091Sbloom #include "text.h"
21*17091Sbloom #include "file.h"
22*17091Sbloom #include "quota.h"
23*17091Sbloom #include "uio.h"
24*17091Sbloom #include "mbuf.h"
2536Sbill 
267497Sroot spgrp(top, npgrp)
2712749Ssam 	register struct proc *top;
287497Sroot {
297497Sroot 	register struct proc *pp, *p;
307497Sroot 	int f = 0;
317497Sroot 
327497Sroot 	for (p = top; npgrp == -1 || u.u_uid == p->p_uid ||
337497Sroot 	    !u.u_uid || inferior(p); p = pp) {
347497Sroot 		if (npgrp == -1) {
357497Sroot #define	bit(a)	(1<<(a-1))
367497Sroot 			p->p_sig &= ~(bit(SIGTSTP)|bit(SIGTTIN)|bit(SIGTTOU));
377497Sroot 		} else
387497Sroot 			p->p_pgrp = npgrp;
397497Sroot 		f++;
407497Sroot 		/*
417497Sroot 		 * Search for children.
427497Sroot 		 */
437497Sroot 		for (pp = proc; pp < procNPROC; pp++)
447497Sroot 			if (pp->p_pptr == p)
457497Sroot 				goto cont;
467497Sroot 		/*
477497Sroot 		 * Search for siblings.
487497Sroot 		 */
497497Sroot 		for (; p != top; p = p->p_pptr)
507497Sroot 			for (pp = p + 1; pp < procNPROC; pp++)
517497Sroot 				if (pp->p_pptr == p->p_pptr)
527497Sroot 					goto cont;
537497Sroot 		break;
547497Sroot 	cont:
557497Sroot 		;
567497Sroot 	}
577497Sroot 	return (f);
587497Sroot }
597497Sroot 
6036Sbill /*
617497Sroot  * Is p an inferior of the current process?
6236Sbill  */
637497Sroot inferior(p)
647816Sroot 	register struct proc *p;
6536Sbill {
6636Sbill 
677497Sroot 	for (; p != u.u_procp; p = p->p_pptr)
687497Sroot 		if (p->p_ppid == 0)
697497Sroot 			return (0);
707497Sroot 	return (1);
7136Sbill }
727816Sroot 
737816Sroot struct proc *
747816Sroot pfind(pid)
757816Sroot 	int pid;
767816Sroot {
777816Sroot 	register struct proc *p;
787816Sroot 
797816Sroot 	for (p = &proc[pidhash[PIDHASH(pid)]]; p != &proc[0]; p = &proc[p->p_idhash])
807816Sroot 		if (p->p_pid == pid)
817816Sroot 			return (p);
827816Sroot 	return ((struct proc *)0);
837816Sroot }
8416529Skarels 
8516529Skarels /*
8616529Skarels  * init the process queues
8716529Skarels  */
8816529Skarels pqinit()
8916529Skarels {
9016529Skarels 	register struct proc *p;
9116529Skarels 
9216529Skarels 	/*
9316529Skarels 	 * most procs are initially on freequeue
9416529Skarels 	 *	nb: we place them there in their "natural" order.
9516529Skarels 	 */
9616529Skarels 
9716529Skarels 	freeproc = NULL;
9816529Skarels 	for (p = procNPROC; --p > proc; freeproc = p)
9916529Skarels 		p->p_nxt = freeproc;
10016529Skarels 
10116529Skarels 	/*
10216529Skarels 	 * but proc[0] is special ...
10316529Skarels 	 */
10416529Skarels 
10516529Skarels 	allproc = p;
10616529Skarels 	p->p_nxt = NULL;
10716529Skarels 	p->p_prev = &allproc;
10816529Skarels 
10916529Skarels 	zombproc = NULL;
11016529Skarels }
111