xref: /csrg-svn/sys/kern/kern_proc.c (revision 23371)
1*23371Smckusick /*
2*23371Smckusick  * Copyright (c) 1982 Regents of the University of California.
3*23371Smckusick  * All rights reserved.  The Berkeley software License Agreement
4*23371Smckusick  * specifies the terms and conditions for redistribution.
5*23371Smckusick  *
6*23371Smckusick  *	@(#)kern_proc.c	6.6 (Berkeley) 06/08/85
7*23371Smckusick  */
836Sbill 
99753Ssam #include "../machine/reg.h"
109753Ssam #include "../machine/pte.h"
119753Ssam #include "../machine/psl.h"
129753Ssam 
1317091Sbloom #include "param.h"
1417091Sbloom #include "systm.h"
1517091Sbloom #include "map.h"
1617091Sbloom #include "dir.h"
1717091Sbloom #include "user.h"
1817091Sbloom #include "kernel.h"
1917091Sbloom #include "proc.h"
2017091Sbloom #include "buf.h"
2117091Sbloom #include "inode.h"
2217091Sbloom #include "seg.h"
2317091Sbloom #include "acct.h"
2417091Sbloom #include "wait.h"
2517091Sbloom #include "vm.h"
2617091Sbloom #include "text.h"
2717091Sbloom #include "file.h"
2817091Sbloom #include "quota.h"
2917091Sbloom #include "uio.h"
3017091Sbloom #include "mbuf.h"
3136Sbill 
3217540Skarels /*
3317540Skarels  * Change the process group of top and all descendents to npgrp.
3417540Skarels  * If npgrp is -1, instead clear any pending stops.
3517540Skarels  */
367497Sroot spgrp(top, npgrp)
3717540Skarels 	struct proc *top;
387497Sroot {
3917540Skarels 	register struct proc *p;
407497Sroot 	int f = 0;
417497Sroot 
4217540Skarels 	p = top;
4317540Skarels 	for (;;) {
4417540Skarels 		if (npgrp == -1)
4517540Skarels 			p->p_sig &=
4617540Skarels 			  ~(sigmask(SIGTSTP)|sigmask(SIGTTIN)|sigmask(SIGTTOU));
4717540Skarels 		else
487497Sroot 			p->p_pgrp = npgrp;
497497Sroot 		f++;
507497Sroot 		/*
5117540Skarels 		 * If this process has children, descend to them next,
5217540Skarels 		 * otherwise do any siblings, and if done with this level,
5317540Skarels 		 * follow back up the tree (but not past top).
547497Sroot 		 */
5517540Skarels 		if (p->p_cptr)
5617540Skarels 			p = p->p_cptr;
5717540Skarels 		else if (p == top)
5817540Skarels 			return (f);
5917540Skarels 		else if (p->p_osptr)
6017540Skarels 			p = p->p_osptr;
6117540Skarels 		else for (;;) {
6217540Skarels 			p = p->p_pptr;
6317540Skarels 			if (p == top)
6417540Skarels 				return (f);
6517540Skarels if (p == &proc[1])
6617540Skarels 	panic("spgrp");
6717540Skarels 			if (p->p_osptr) {
6817540Skarels 				p = p->p_osptr;
6917540Skarels 				break;
7017540Skarels 			}
7117540Skarels 		}
727497Sroot 	}
737497Sroot }
747497Sroot 
7536Sbill /*
767497Sroot  * Is p an inferior of the current process?
7736Sbill  */
787497Sroot inferior(p)
797816Sroot 	register struct proc *p;
8036Sbill {
8136Sbill 
827497Sroot 	for (; p != u.u_procp; p = p->p_pptr)
837497Sroot 		if (p->p_ppid == 0)
847497Sroot 			return (0);
857497Sroot 	return (1);
8636Sbill }
877816Sroot 
887816Sroot struct proc *
897816Sroot pfind(pid)
907816Sroot 	int pid;
917816Sroot {
927816Sroot 	register struct proc *p;
937816Sroot 
947816Sroot 	for (p = &proc[pidhash[PIDHASH(pid)]]; p != &proc[0]; p = &proc[p->p_idhash])
957816Sroot 		if (p->p_pid == pid)
967816Sroot 			return (p);
977816Sroot 	return ((struct proc *)0);
987816Sroot }
9916529Skarels 
10016529Skarels /*
10116529Skarels  * init the process queues
10216529Skarels  */
10316529Skarels pqinit()
10416529Skarels {
10516529Skarels 	register struct proc *p;
10616529Skarels 
10716529Skarels 	/*
10816529Skarels 	 * most procs are initially on freequeue
10916529Skarels 	 *	nb: we place them there in their "natural" order.
11016529Skarels 	 */
11116529Skarels 
11216529Skarels 	freeproc = NULL;
11316529Skarels 	for (p = procNPROC; --p > proc; freeproc = p)
11416529Skarels 		p->p_nxt = freeproc;
11516529Skarels 
11616529Skarels 	/*
11716529Skarels 	 * but proc[0] is special ...
11816529Skarels 	 */
11916529Skarels 
12016529Skarels 	allproc = p;
12116529Skarels 	p->p_nxt = NULL;
12216529Skarels 	p->p_prev = &allproc;
12316529Skarels 
12416529Skarels 	zombproc = NULL;
12516529Skarels }
126