|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */ ! 26: /*- ! 27: * Copyright (c) 1986, 1989, 1991, 1993 ! 28: * The Regents of the University of California. All rights reserved. ! 29: * (c) UNIX System Laboratories, Inc. ! 30: * All or some portions of this file are derived from material licensed ! 31: * to the University of California by American Telephone and Telegraph ! 32: * Co. or Unix System Laboratories, Inc. and are reproduced herein with ! 33: * the permission of UNIX System Laboratories, Inc. ! 34: * ! 35: * Redistribution and use in source and binary forms, with or without ! 36: * modification, are permitted provided that the following conditions ! 37: * are met: ! 38: * 1. Redistributions of source code must retain the above copyright ! 39: * notice, this list of conditions and the following disclaimer. ! 40: * 2. Redistributions in binary form must reproduce the above copyright ! 41: * notice, this list of conditions and the following disclaimer in the ! 42: * documentation and/or other materials provided with the distribution. ! 43: * 3. All advertising materials mentioning features or use of this software ! 44: * must display the following acknowledgement: ! 45: * This product includes software developed by the University of ! 46: * California, Berkeley and its contributors. ! 47: * 4. Neither the name of the University nor the names of its contributors ! 48: * may be used to endorse or promote products derived from this software ! 49: * without specific prior written permission. ! 50: * ! 51: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 52: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 53: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 54: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 55: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 56: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 57: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 58: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 59: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 60: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 61: * SUCH DAMAGE. ! 62: * ! 63: * @(#)proc.h 8.15 (Berkeley) 5/19/95 ! 64: */ ! 65: ! 66: #ifndef _SYS_PROC_H_ ! 67: #define _SYS_PROC_H_ ! 68: ! 69: #include <sys/select.h> /* For struct selinfo. */ ! 70: #include <sys/queue.h> ! 71: #include <sys/lock.h> ! 72: ! 73: /* ! 74: * One structure allocated per session. ! 75: */ ! 76: struct session { ! 77: int s_count; /* Ref cnt; pgrps in session. */ ! 78: struct proc *s_leader; /* Session leader. */ ! 79: struct vnode *s_ttyvp; /* Vnode of controlling terminal. */ ! 80: struct tty *s_ttyp; /* Controlling terminal. */ ! 81: char s_login[MAXLOGNAME]; /* Setlogin() name. */ ! 82: }; ! 83: ! 84: /* ! 85: * One structure allocated per process group. ! 86: */ ! 87: struct pgrp { ! 88: LIST_ENTRY(pgrp) pg_hash; /* Hash chain. */ ! 89: LIST_HEAD(, proc) pg_members; /* Pointer to pgrp members. */ ! 90: struct session *pg_session; /* Pointer to session. */ ! 91: pid_t pg_id; /* Pgrp id. */ ! 92: int pg_jobc; /* # procs qualifying pgrp for job control */ ! 93: }; ! 94: ! 95: /* ! 96: * Description of a process. ! 97: * ! 98: * This structure contains the information needed to manage a thread of ! 99: * control, known in UN*X as a process; it has references to substructures ! 100: * containing descriptions of things that the process uses, but may share ! 101: * with related processes. The process structure and the substructures ! 102: * are always addressible except for those marked "(PROC ONLY)" below, ! 103: * which might be addressible only on a processor on which the process ! 104: * is running. ! 105: */ ! 106: struct proc { ! 107: LIST_ENTRY(proc) p_list; /* List of all processes. */ ! 108: ! 109: /* substructures: */ ! 110: struct pcred *p_cred; /* Process owner's identity. */ ! 111: struct filedesc *p_fd; /* Ptr to open files structure. */ ! 112: struct pstats *p_stats; /* Accounting/statistics (PROC ONLY). */ ! 113: struct plimit *p_limit; /* Process limits. */ ! 114: struct sigacts *p_sigacts; /* Signal actions, state (PROC ONLY). */ ! 115: ! 116: #define p_ucred p_cred->pc_ucred ! 117: #define p_rlimit p_limit->pl_rlimit ! 118: ! 119: int p_flag; /* P_* flags. */ ! 120: char p_stat; /* S* process status. */ ! 121: char p_pad1[3]; ! 122: ! 123: pid_t p_pid; /* Process identifier. */ ! 124: LIST_ENTRY(proc) p_pglist; /* List of processes in pgrp. */ ! 125: struct proc *p_pptr; /* Pointer to parent process. */ ! 126: LIST_ENTRY(proc) p_sibling; /* List of sibling processes. */ ! 127: LIST_HEAD(, proc) p_children; /* Pointer to list of children. */ ! 128: ! 129: /* The following fields are all zeroed upon creation in fork. */ ! 130: #define p_startzero p_oppid ! 131: ! 132: pid_t p_oppid; /* Save parent pid during ptrace. XXX */ ! 133: int p_dupfd; /* Sideways return value from fdopen. XXX */ ! 134: ! 135: /* scheduling */ ! 136: u_int p_estcpu; /* Time averaged value of p_cpticks. */ ! 137: int p_cpticks; /* Ticks of cpu time. */ ! 138: fixpt_t p_pctcpu; /* %cpu for this process during p_swtime */ ! 139: void *p_wchan; /* Sleep address. */ ! 140: char *p_wmesg; /* Reason for sleep. */ ! 141: u_int p_swtime; /* Time swapped in or out. */ ! 142: u_int p_slptime; /* Time since last blocked. */ ! 143: ! 144: struct itimerval p_realtimer; /* Alarm timer. */ ! 145: struct timeval p_rtime; /* Real time. */ ! 146: u_quad_t p_uticks; /* Statclock hits in user mode. */ ! 147: u_quad_t p_sticks; /* Statclock hits in system mode. */ ! 148: u_quad_t p_iticks; /* Statclock hits processing intr. */ ! 149: ! 150: int p_traceflag; /* Kernel trace points. */ ! 151: struct vnode *p_tracep; /* Trace to vnode. */ ! 152: ! 153: sigset_t p_siglist; /* Signals arrived but not delivered. */ ! 154: ! 155: struct vnode *p_textvp; /* Vnode of executable. */ ! 156: ! 157: /* End area that is zeroed on creation. */ ! 158: #define p_endzero p_hash.le_next ! 159: ! 160: /* ! 161: * Not copied, not zero'ed. ! 162: * Belongs after p_pid, but here to avoid shifting proc elements. ! 163: */ ! 164: LIST_ENTRY(proc) p_hash; /* Hash chain. */ ! 165: TAILQ_HEAD( ,eventqelt) p_evlist; ! 166: ! 167: /* The following fields are all copied upon creation in fork. */ ! 168: #define p_startcopy p_sigmask ! 169: ! 170: sigset_t p_sigmask; /* Current signal mask. */ ! 171: sigset_t p_sigignore; /* Signals being ignored. */ ! 172: sigset_t p_sigcatch; /* Signals being caught by user. */ ! 173: ! 174: u_char p_priority; /* Process priority. */ ! 175: u_char p_usrpri; /* User-priority based on p_cpu and p_nice. */ ! 176: char p_nice; /* Process "nice" value. */ ! 177: char p_comm[MAXCOMLEN+1]; ! 178: ! 179: struct pgrp *p_pgrp; /* Pointer to process group. */ ! 180: ! 181: /* End area that is copied on creation. */ ! 182: #define p_endcopy p_xstat ! 183: ! 184: u_short p_xstat; /* Exit status for wait; also stop signal. */ ! 185: u_short p_acflag; /* Accounting flags. */ ! 186: struct rusage *p_ru; /* Exit information. XXX */ ! 187: ! 188: int p_debugger; /* 1: can exec set-bit programs if suser */ ! 189: ! 190: void *task; /* corresponding task */ ! 191: void *sigwait_thread; /* 'thread' holding sigwait */ ! 192: simple_lock_data_t siglock; /* multiple thread signal lock */ ! 193: boolean_t sigwait; /* indication to suspend */ ! 194: void *exit_thread; /* Which thread is exiting? */ ! 195: caddr_t user_stack; /* where user stack was allocated */ ! 196: }; ! 197: ! 198: /* Exported fields for kern sysctls */ ! 199: struct extern_proc { ! 200: struct proc *p_forw; /* Doubly-linked run/sleep queue. */ ! 201: struct proc *p_back; ! 202: struct vmspace *p_vmspace; /* Address space. */ ! 203: struct sigacts *p_sigacts; /* Signal actions, state (PROC ONLY). */ ! 204: int p_flag; /* P_* flags. */ ! 205: char p_stat; /* S* process status. */ ! 206: pid_t p_pid; /* Process identifier. */ ! 207: pid_t p_oppid; /* Save parent pid during ptrace. XXX */ ! 208: int p_dupfd; /* Sideways return value from fdopen. XXX */ ! 209: /* Mach related */ ! 210: caddr_t user_stack; /* where user stack was allocated */ ! 211: void *exit_thread; /* XXX Which thread is exiting? */ ! 212: int p_debugger; /* allow to debug */ ! 213: boolean_t sigwait; /* indication to suspend */ ! 214: /* scheduling */ ! 215: u_int p_estcpu; /* Time averaged value of p_cpticks. */ ! 216: int p_cpticks; /* Ticks of cpu time. */ ! 217: fixpt_t p_pctcpu; /* %cpu for this process during p_swtime */ ! 218: void *p_wchan; /* Sleep address. */ ! 219: char *p_wmesg; /* Reason for sleep. */ ! 220: u_int p_swtime; /* Time swapped in or out. */ ! 221: u_int p_slptime; /* Time since last blocked. */ ! 222: struct itimerval p_realtimer; /* Alarm timer. */ ! 223: struct timeval p_rtime; /* Real time. */ ! 224: u_quad_t p_uticks; /* Statclock hits in user mode. */ ! 225: u_quad_t p_sticks; /* Statclock hits in system mode. */ ! 226: u_quad_t p_iticks; /* Statclock hits processing intr. */ ! 227: int p_traceflag; /* Kernel trace points. */ ! 228: struct vnode *p_tracep; /* Trace to vnode. */ ! 229: int p_siglist; /* Signals arrived but not delivered. */ ! 230: struct vnode *p_textvp; /* Vnode of executable. */ ! 231: int p_holdcnt; /* If non-zero, don't swap. */ ! 232: sigset_t p_sigmask; /* Current signal mask. */ ! 233: sigset_t p_sigignore; /* Signals being ignored. */ ! 234: sigset_t p_sigcatch; /* Signals being caught by user. */ ! 235: u_char p_priority; /* Process priority. */ ! 236: u_char p_usrpri; /* User-priority based on p_cpu and p_nice. */ ! 237: char p_nice; /* Process "nice" value. */ ! 238: char p_comm[MAXCOMLEN+1]; ! 239: struct pgrp *p_pgrp; /* Pointer to process group. */ ! 240: struct user *p_addr; /* Kernel virtual addr of u-area (PROC ONLY). */ ! 241: u_short p_xstat; /* Exit status for wait; also stop signal. */ ! 242: u_short p_acflag; /* Accounting flags. */ ! 243: struct rusage *p_ru; /* Exit information. XXX */ ! 244: }; ! 245: ! 246: #define p_session p_pgrp->pg_session ! 247: #define p_pgid p_pgrp->pg_id ! 248: ! 249: /* Status values. */ ! 250: #define SIDL 1 /* Process being created by fork. */ ! 251: #define SRUN 2 /* Currently runnable. */ ! 252: #define SSLEEP 3 /* Sleeping on an address. */ ! 253: #define SSTOP 4 /* Process debugging or suspension. */ ! 254: #define SZOMB 5 /* Awaiting collection by parent. */ ! 255: ! 256: /* These flags are kept in p_flags. */ ! 257: #define P_ADVLOCK 0x00001 /* Process may hold a POSIX advisory lock. */ ! 258: #define P_CONTROLT 0x00002 /* Has a controlling terminal. */ ! 259: #define P_INMEM 0x00004 /* Loaded into memory. */ ! 260: #define P_NOCLDSTOP 0x00008 /* No SIGCHLD when children stop. */ ! 261: #define P_PPWAIT 0x00010 /* Parent is waiting for child to exec/exit. */ ! 262: #define P_PROFIL 0x00020 /* Has started profiling. */ ! 263: #define P_SELECT 0x00040 /* Selecting; wakeup/waiting danger. */ ! 264: #define P_SINTR 0x00080 /* Sleep is interruptible. */ ! 265: #define P_SUGID 0x00100 /* Had set id privileges since last exec. */ ! 266: #define P_SYSTEM 0x00200 /* System proc: no sigs, stats or swapping. */ ! 267: #define P_TIMEOUT 0x00400 /* Timing out during sleep. */ ! 268: #define P_TRACED 0x00800 /* Debugged process being traced. */ ! 269: #define P_WAITED 0x01000 /* Debugging process has waited for child. */ ! 270: #define P_WEXIT 0x02000 /* Working on exiting. */ ! 271: #define P_EXEC 0x04000 /* Process called exec. */ ! 272: ! 273: /* Should probably be changed into a hold count. */ ! 274: #define P_NOSWAP 0x08000 /* Another flag to prevent swap out. */ ! 275: #define P_PHYSIO 0x10000 /* Doing physical I/O. */ ! 276: ! 277: /* Should be moved to machine-dependent areas. */ ! 278: #define P_OWEUPC 0x08000 /* Owe process an addupc() call at next ast. */ ! 279: ! 280: /* XXX Not sure what to do with these, yet. */ ! 281: #define P_FSTRACE 0x10000 /* tracing via file system (elsewhere?) */ ! 282: #define P_SSTEP 0x20000 /* process needs single-step fixup ??? */ ! 283: ! 284: /* ! 285: * Shareable process credentials (always resident). This includes a reference ! 286: * to the current user credentials as well as real and saved ids that may be ! 287: * used to change ids. ! 288: */ ! 289: struct pcred { ! 290: struct lock__bsd__ pc_lock; ! 291: struct ucred *pc_ucred; /* Current credentials. */ ! 292: uid_t p_ruid; /* Real user id. */ ! 293: uid_t p_svuid; /* Saved effective user id. */ ! 294: gid_t p_rgid; /* Real group id. */ ! 295: gid_t p_svgid; /* Saved effective group id. */ ! 296: int p_refcnt; /* Number of references. */ ! 297: }; ! 298: ! 299: #define pcred_readlock(p) lockmgr(&(p)->p_cred->pc_lock, \ ! 300: LK_SHARED, 0, (p)) ! 301: #define pcred_writelock(p) lockmgr(&(p)->p_cred->pc_lock, \ ! 302: LK_EXCLUSIVE, 0, (p)) ! 303: #define pcred_unlock(p) lockmgr(&(p)->p_cred->pc_lock, \ ! 304: LK_RELEASE, 0, (p)) ! 305: ! 306: #ifdef _KERNEL ! 307: /* ! 308: * We use process IDs <= PID_MAX; PID_MAX + 1 must also fit in a pid_t, ! 309: * as it is used to represent "no process group". ! 310: */ ! 311: #define PID_MAX 30000 ! 312: #define NO_PID 30001 ! 313: ! 314: #define SESS_LEADER(p) ((p)->p_session->s_leader == (p)) ! 315: #define SESSHOLD(s) ((s)->s_count++) ! 316: #define SESSRELE(s) sessrele(s) ! 317: ! 318: #define PIDHASH(pid) (&pidhashtbl[(pid) & pidhash]) ! 319: extern LIST_HEAD(pidhashhead, proc) *pidhashtbl; ! 320: extern u_long pidhash; ! 321: ! 322: #define PGRPHASH(pgid) (&pgrphashtbl[(pgid) & pgrphash]) ! 323: extern LIST_HEAD(pgrphashhead, pgrp) *pgrphashtbl; ! 324: extern u_long pgrphash; ! 325: ! 326: extern int nprocs, maxproc; /* Current and max number of procs. */ ! 327: ! 328: LIST_HEAD(proclist, proc); ! 329: extern struct proclist allproc; /* List of all processes. */ ! 330: extern struct proclist zombproc; /* List of zombie processes. */ ! 331: extern struct proc *initproc, *kernproc; ! 332: ! 333: extern struct proc *pfind __P((pid_t)); /* Find process by id. */ ! 334: extern struct pgrp *pgfind __P((pid_t)); /* Find process group by id. */ ! 335: ! 336: extern int chgproccnt __P((uid_t uid, int diff)); ! 337: extern int enterpgrp __P((struct proc *p, pid_t pgid, int mksess)); ! 338: extern void fixjobc __P((struct proc *p, struct pgrp *pgrp, int entering)); ! 339: extern int inferior __P((struct proc *p)); ! 340: extern int leavepgrp __P((struct proc *p)); ! 341: extern void mi_switch __P((void)); ! 342: extern void pgdelete __P((struct pgrp *pgrp)); ! 343: extern void sessrele __P((struct session *sess)); ! 344: extern void procinit __P((void)); ! 345: extern void resetpriority __P((struct proc *)); ! 346: extern void setrunnable __P((struct proc *)); ! 347: extern void setrunqueue __P((struct proc *)); ! 348: extern int sleep __P((void *chan, int pri)); ! 349: extern int tsleep __P((void *chan, int pri, char *wmesg, int timo)); ! 350: extern void unsleep __P((struct proc *)); ! 351: extern void wakeup __P((void *chan)); ! 352: #endif /* _KERNEL */ ! 353: ! 354: #endif /* !_SYS_PROC_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.