|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1986, 1989, 1991 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. All advertising materials mentioning features or use of this software ! 14: * must display the following acknowledgement: ! 15: * This product includes software developed by the University of ! 16: * California, Berkeley and its contributors. ! 17: * 4. Neither the name of the University nor the names of its contributors ! 18: * may be used to endorse or promote products derived from this software ! 19: * without specific prior written permission. ! 20: * ! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 31: * SUCH DAMAGE. ! 32: * ! 33: * @(#)proc.h 7.28 (Berkeley) 5/30/91 ! 34: */ ! 35: ! 36: #ifndef _PROC_H_ ! 37: #define _PROC_H_ ! 38: ! 39: #include <machine/proc.h> /* machine-dependent proc substruct */ ! 40: ! 41: /* ! 42: * One structure allocated per session. ! 43: */ ! 44: struct session { ! 45: int s_count; /* ref cnt; pgrps in session */ ! 46: struct proc *s_leader; /* session leader */ ! 47: struct vnode *s_ttyvp; /* vnode of controlling terminal */ ! 48: struct tty *s_ttyp; /* controlling terminal */ ! 49: char s_login[MAXLOGNAME]; /* setlogin() name */ ! 50: }; ! 51: ! 52: /* ! 53: * One structure allocated per process group. ! 54: */ ! 55: struct pgrp { ! 56: struct pgrp *pg_hforw; /* forward link in hash bucket */ ! 57: struct proc *pg_mem; /* pointer to pgrp members */ ! 58: struct session *pg_session; /* pointer to session */ ! 59: pid_t pg_id; /* pgrp id */ ! 60: int pg_jobc; /* # procs qualifying pgrp for job control */ ! 61: }; ! 62: ! 63: /* ! 64: * Description of a process. ! 65: * This structure contains the information needed to manage a thread ! 66: * of control, known in UN*X as a process; it has references to substructures ! 67: * containing descriptions of things that the process uses, but may share ! 68: * with related processes. The process structure and the substructures ! 69: * are always addressible except for those marked "(PROC ONLY)" below, ! 70: * which might be addressible only on a processor on which the process ! 71: * is running. ! 72: */ ! 73: struct proc { ! 74: struct proc *p_link; /* doubly-linked run/sleep queue */ ! 75: struct proc *p_rlink; ! 76: struct proc *p_nxt; /* linked list of active procs */ ! 77: struct proc **p_prev; /* and zombies */ ! 78: ! 79: /* substructures: */ ! 80: struct pcred *p_cred; /* process owner's identity */ ! 81: struct filedesc *p_fd; /* ptr to open files structure */ ! 82: struct pstats *p_stats; /* accounting/statistics (PROC ONLY) */ ! 83: struct plimit *p_limit; /* process limits */ ! 84: struct vmspace *p_vmspace; /* address space */ ! 85: struct sigacts *p_sigacts; /* signal actions, state (PROC ONLY) */ ! 86: ! 87: #define p_ucred p_cred->pc_ucred ! 88: #define p_rlimit p_limit->pl_rlimit ! 89: ! 90: int p_flag; ! 91: char p_stat; ! 92: /* char p_space; */ ! 93: ! 94: pid_t p_pid; /* unique process id */ ! 95: struct proc *p_hash; /* hashed based on p_pid for kill+exit+... */ ! 96: struct proc *p_pgrpnxt; /* pointer to next process in process group */ ! 97: struct proc *p_pptr; /* pointer to process structure of parent */ ! 98: struct proc *p_osptr; /* pointer to older sibling processes */ ! 99: ! 100: /* The following fields are all zeroed upon creation in fork */ ! 101: #define p_startzero p_ysptr ! 102: struct proc *p_ysptr; /* pointer to younger siblings */ ! 103: struct proc *p_cptr; /* pointer to youngest living child */ ! 104: ! 105: /* scheduling */ ! 106: u_int p_cpu; /* cpu usage for scheduling */ ! 107: int p_cpticks; /* ticks of cpu time */ ! 108: fixpt_t p_pctcpu; /* %cpu for this process during p_time */ ! 109: caddr_t p_wchan; /* event process is awaiting */ ! 110: u_int p_time; /* resident/nonresident time for swapping */ ! 111: u_int p_slptime; /* time since last block */ ! 112: ! 113: struct itimerval p_realtimer; /* alarm timer */ ! 114: struct timeval p_utime; /* user time */ ! 115: struct timeval p_stime; /* system time */ ! 116: ! 117: int p_traceflag; /* kernel trace points */ ! 118: struct vnode *p_tracep;/* trace to vnode */ ! 119: ! 120: int p_sig; /* signals pending to this process */ ! 121: ! 122: /* end area that is zeroed on creation */ ! 123: #define p_endzero p_startcopy ! 124: ! 125: /* The following fields are all copied upon creation in fork */ ! 126: sigset_t p_sigmask; /* current signal mask */ ! 127: #define p_startcopy p_sigmask ! 128: sigset_t p_sigignore; /* signals being ignored */ ! 129: sigset_t p_sigcatch; /* signals being caught by user */ ! 130: ! 131: u_char p_pri; /* priority, negative is high */ ! 132: u_char p_usrpri; /* user-priority based on p_cpu and p_nice */ ! 133: char p_nice; /* nice for cpu usage */ ! 134: /* char p_space1; */ ! 135: ! 136: struct pgrp *p_pgrp; /* pointer to process group */ ! 137: char p_comm[MAXCOMLEN+1]; ! 138: ! 139: /* end area that is copied on creation */ ! 140: #define p_endcopy p_wmesg ! 141: char *p_wmesg; /* reason for sleep */ ! 142: int p_thread; /* id for this "thread" (Mach glue) XXX */ ! 143: struct user *p_addr; /* kernel virtual addr of u-area (PROC ONLY) */ ! 144: swblk_t p_swaddr; /* disk address of u area when swapped */ ! 145: int *p_regs; /* saved registers during syscall/trap */ ! 146: struct mdproc p_md; /* any machine-dependent fields */ ! 147: ! 148: u_short p_xstat; /* Exit status for wait; also stop signal */ ! 149: u_short p_dupfd; /* sideways return value from fdopen XXX */ ! 150: u_short p_acflag; /* accounting flags */ ! 151: /* short p_space2; */ ! 152: struct rusage *p_ru; /* exit information XXX */ ! 153: ! 154: long p_spare[4]; /* tmp spares to avoid shifting eproc */ ! 155: }; ! 156: ! 157: #define p_session p_pgrp->pg_session ! 158: #define p_pgid p_pgrp->pg_id ! 159: ! 160: /* MOVE TO ucred.h? */ ! 161: /* ! 162: * Shareable process credentials (always resident). ! 163: * This includes a reference to the current user credentials ! 164: * as well as real and saved ids that may be used to change ids. ! 165: */ ! 166: struct pcred { ! 167: struct ucred *pc_ucred; /* current credentials */ ! 168: uid_t p_ruid; /* real user id */ ! 169: uid_t p_svuid; /* saved effective user id */ ! 170: gid_t p_rgid; /* real group id */ ! 171: gid_t p_svgid; /* saved effective group id */ ! 172: int p_refcnt; /* number of references */ ! 173: }; ! 174: ! 175: /* stat codes */ ! 176: #define SSLEEP 1 /* awaiting an event */ ! 177: #define SWAIT 2 /* (abandoned state) */ ! 178: #define SRUN 3 /* running */ ! 179: #define SIDL 4 /* intermediate state in process creation */ ! 180: #define SZOMB 5 /* intermediate state in process termination */ ! 181: #define SSTOP 6 /* process being traced */ ! 182: ! 183: /* flag codes */ ! 184: #define SLOAD 0x0000001 /* in core */ ! 185: #define SSYS 0x0000002 /* swapper or pager process */ ! 186: #define SSINTR 0x0000004 /* sleep is interruptible */ ! 187: #define SCTTY 0x0000008 /* has a controlling terminal */ ! 188: #define SPPWAIT 0x0000010 /* parent is waiting for child to exec/exit */ ! 189: #define SEXEC 0x0000020 /* process called exec */ ! 190: #define STIMO 0x0000040 /* timing out during sleep */ ! 191: #define SSEL 0x0000080 /* selecting; wakeup/waiting danger */ ! 192: #define SWEXIT 0x0000100 /* working on exiting */ ! 193: #define SNOCLDSTOP 0x0000200 /* no SIGCHLD when children stop */ ! 194: /* the following three should probably be changed into a hold count */ ! 195: #define SLOCK 0x0000400 /* process being swapped out */ ! 196: #define SKEEP 0x0000800 /* another flag to prevent swap out */ ! 197: #define SPHYSIO 0x0001000 /* doing physical i/o */ ! 198: #define STRC 0x0004000 /* process is being traced */ ! 199: #define SWTED 0x0008000 /* another tracing flag */ ! 200: #define SADVLCK 0x0040000 /* process may hold a POSIX advisory lock */ ! 201: /* the following should be moved to machine-dependent areas */ ! 202: #define SOWEUPC 0x0002000 /* owe process an addupc() call at next ast */ ! 203: #ifdef HPUXCOMPAT ! 204: #define SHPUX 0x0010000 /* HP-UX process (HPUXCOMPAT) */ ! 205: #else ! 206: #define SHPUX 0 /* not HP-UX process (HPUXCOMPAT) */ ! 207: #endif ! 208: /* not currently in use (never set) */ ! 209: #define SPAGE 0x0020000 /* process in page wait state */ ! 210: ! 211: #ifdef KERNEL ! 212: /* ! 213: * We use process IDs <= PID_MAX; ! 214: * PID_MAX + 1 must also fit in a pid_t ! 215: * (used to represent "no process group"). ! 216: */ ! 217: #define PID_MAX 30000 ! 218: #define NO_PID 30001 ! 219: #define PIDHASH(pid) ((pid) & pidhashmask) ! 220: ! 221: #define SESS_LEADER(p) ((p)->p_session->s_leader == (p)) ! 222: #define SESSHOLD(s) ((s)->s_count++) ! 223: #define SESSRELE(s) { \ ! 224: if (--(s)->s_count == 0) \ ! 225: FREE(s, M_SESSION); \ ! 226: } ! 227: ! 228: extern int pidhashmask; /* in param.c */ ! 229: extern struct proc *pidhash[]; /* in param.c */ ! 230: struct proc *pfind(); /* find process by id */ ! 231: extern struct pgrp *pgrphash[]; /* in param.c */ ! 232: struct pgrp *pgfind(); /* find process group by id */ ! 233: struct proc *zombproc, *allproc; /* lists of procs in various states */ ! 234: extern struct proc proc0; /* process slot for swapper */ ! 235: struct proc *initproc, *pageproc; /* process slots for init, pager */ ! 236: extern struct proc *curproc; /* current running proc */ ! 237: extern int nprocs, maxproc; /* current and max number of procs */ ! 238: ! 239: #define NQS 32 /* 32 run queues */ ! 240: struct prochd { ! 241: struct proc *ph_link; /* linked list of running processes */ ! 242: struct proc *ph_rlink; ! 243: } qs[NQS]; ! 244: ! 245: int whichqs; /* bit mask summarizing non-empty qs's */ ! 246: #endif /* KERNEL */ ! 247: ! 248: #endif /* !_PROC_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.