|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */ ! 23: /*- ! 24: * Copyright (c) 1986, 1989, 1991, 1993 ! 25: * The Regents of the University of California. All rights reserved. ! 26: * (c) UNIX System Laboratories, Inc. ! 27: * All or some portions of this file are derived from material licensed ! 28: * to the University of California by American Telephone and Telegraph ! 29: * Co. or Unix System Laboratories, Inc. and are reproduced herein with ! 30: * the permission of UNIX System Laboratories, Inc. ! 31: * ! 32: * Redistribution and use in source and binary forms, with or without ! 33: * modification, are permitted provided that the following conditions ! 34: * are met: ! 35: * 1. Redistributions of source code must retain the above copyright ! 36: * notice, this list of conditions and the following disclaimer. ! 37: * 2. Redistributions in binary form must reproduce the above copyright ! 38: * notice, this list of conditions and the following disclaimer in the ! 39: * documentation and/or other materials provided with the distribution. ! 40: * 3. All advertising materials mentioning features or use of this software ! 41: * must display the following acknowledgement: ! 42: * This product includes software developed by the University of ! 43: * California, Berkeley and its contributors. ! 44: * 4. Neither the name of the University nor the names of its contributors ! 45: * may be used to endorse or promote products derived from this software ! 46: * without specific prior written permission. ! 47: * ! 48: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 49: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 50: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 51: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 52: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 53: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 54: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 55: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 56: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 57: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 58: * SUCH DAMAGE. ! 59: * ! 60: * @(#)proc.h 8.15 (Berkeley) 5/19/95 ! 61: */ ! 62: ! 63: #ifndef _SYS_PROC_H_ ! 64: #define _SYS_PROC_H_ ! 65: ! 66: #include <sys/cdefs.h> ! 67: ! 68: #include <sys/select.h> /* For struct selinfo. */ ! 69: #include <sys/queue.h> ! 70: #include <sys/lock.h> ! 71: #include <sys/param.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: void * exitarg; /* exit arg for proc terminate */ ! 197: void * vm_shm; /* for sysV shared memory */ ! 198: }; ! 199: ! 200: /* Exported fields for kern sysctls */ ! 201: struct extern_proc { ! 202: struct proc *p_forw; /* Doubly-linked run/sleep queue. */ ! 203: struct proc *p_back; ! 204: struct vmspace *p_vmspace; /* Address space. */ ! 205: struct sigacts *p_sigacts; /* Signal actions, state (PROC ONLY). */ ! 206: int p_flag; /* P_* flags. */ ! 207: char p_stat; /* S* process status. */ ! 208: pid_t p_pid; /* Process identifier. */ ! 209: pid_t p_oppid; /* Save parent pid during ptrace. XXX */ ! 210: int p_dupfd; /* Sideways return value from fdopen. XXX */ ! 211: /* Mach related */ ! 212: caddr_t user_stack; /* where user stack was allocated */ ! 213: void *exit_thread; /* XXX Which thread is exiting? */ ! 214: int p_debugger; /* allow to debug */ ! 215: boolean_t sigwait; /* indication to suspend */ ! 216: /* scheduling */ ! 217: u_int p_estcpu; /* Time averaged value of p_cpticks. */ ! 218: int p_cpticks; /* Ticks of cpu time. */ ! 219: fixpt_t p_pctcpu; /* %cpu for this process during p_swtime */ ! 220: void *p_wchan; /* Sleep address. */ ! 221: char *p_wmesg; /* Reason for sleep. */ ! 222: u_int p_swtime; /* Time swapped in or out. */ ! 223: u_int p_slptime; /* Time since last blocked. */ ! 224: struct itimerval p_realtimer; /* Alarm timer. */ ! 225: struct timeval p_rtime; /* Real time. */ ! 226: u_quad_t p_uticks; /* Statclock hits in user mode. */ ! 227: u_quad_t p_sticks; /* Statclock hits in system mode. */ ! 228: u_quad_t p_iticks; /* Statclock hits processing intr. */ ! 229: int p_traceflag; /* Kernel trace points. */ ! 230: struct vnode *p_tracep; /* Trace to vnode. */ ! 231: int p_siglist; /* Signals arrived but not delivered. */ ! 232: struct vnode *p_textvp; /* Vnode of executable. */ ! 233: int p_holdcnt; /* If non-zero, don't swap. */ ! 234: sigset_t p_sigmask; /* Current signal mask. */ ! 235: sigset_t p_sigignore; /* Signals being ignored. */ ! 236: sigset_t p_sigcatch; /* Signals being caught by user. */ ! 237: u_char p_priority; /* Process priority. */ ! 238: u_char p_usrpri; /* User-priority based on p_cpu and p_nice. */ ! 239: char p_nice; /* Process "nice" value. */ ! 240: char p_comm[MAXCOMLEN+1]; ! 241: struct pgrp *p_pgrp; /* Pointer to process group. */ ! 242: struct user *p_addr; /* Kernel virtual addr of u-area (PROC ONLY). */ ! 243: u_short p_xstat; /* Exit status for wait; also stop signal. */ ! 244: u_short p_acflag; /* Accounting flags. */ ! 245: struct rusage *p_ru; /* Exit information. XXX */ ! 246: }; ! 247: ! 248: #define p_session p_pgrp->pg_session ! 249: #define p_pgid p_pgrp->pg_id ! 250: ! 251: /* Status values. */ ! 252: #define SIDL 1 /* Process being created by fork. */ ! 253: #define SRUN 2 /* Currently runnable. */ ! 254: #define SSLEEP 3 /* Sleeping on an address. */ ! 255: #define SSTOP 4 /* Process debugging or suspension. */ ! 256: #define SZOMB 5 /* Awaiting collection by parent. */ ! 257: ! 258: /* These flags are kept in p_flags. */ ! 259: #define P_ADVLOCK 0x00001 /* Process may hold a POSIX advisory lock. */ ! 260: #define P_CONTROLT 0x00002 /* Has a controlling terminal. */ ! 261: #define P_INMEM 0x00004 /* Loaded into memory. */ ! 262: #define P_NOCLDSTOP 0x00008 /* No SIGCHLD when children stop. */ ! 263: #define P_PPWAIT 0x00010 /* Parent is waiting for child to exec/exit. */ ! 264: #define P_PROFIL 0x00020 /* Has started profiling. */ ! 265: #define P_SELECT 0x00040 /* Selecting; wakeup/waiting danger. */ ! 266: #define P_SINTR 0x00080 /* Sleep is interruptible. */ ! 267: #define P_SUGID 0x00100 /* Had set id privileges since last exec. */ ! 268: #define P_SYSTEM 0x00200 /* System proc: no sigs, stats or swapping. */ ! 269: #define P_TIMEOUT 0x00400 /* Timing out during sleep. */ ! 270: #define P_TRACED 0x00800 /* Debugged process being traced. */ ! 271: #define P_WAITED 0x01000 /* Debugging process has waited for child. */ ! 272: #define P_WEXIT 0x02000 /* Working on exiting. */ ! 273: #define P_EXEC 0x04000 /* Process called exec. */ ! 274: #define P_KDEBUG 0x08000 /* kdebug tracing is on for this process */ ! 275: ! 276: /* Should probably be changed into a hold count. */ ! 277: #define P_NOSWAP 0x08000 /* Another flag to prevent swap out. */ ! 278: #define P_PHYSIO 0x10000 /* Doing physical I/O. */ ! 279: ! 280: /* Should be moved to machine-dependent areas. */ ! 281: #define P_OWEUPC 0x08000 /* Owe process an addupc() call at next ast. */ ! 282: ! 283: /* XXX Not sure what to do with these, yet. */ ! 284: #define P_FSTRACE 0x10000 /* tracing via file system (elsewhere?) */ ! 285: #define P_SSTEP 0x20000 /* process needs single-step fixup ??? */ ! 286: ! 287: /* ! 288: * Shareable process credentials (always resident). This includes a reference ! 289: * to the current user credentials as well as real and saved ids that may be ! 290: * used to change ids. ! 291: */ ! 292: struct pcred { ! 293: struct lock__bsd__ pc_lock; ! 294: struct ucred *pc_ucred; /* Current credentials. */ ! 295: uid_t p_ruid; /* Real user id. */ ! 296: uid_t p_svuid; /* Saved effective user id. */ ! 297: gid_t p_rgid; /* Real group id. */ ! 298: gid_t p_svgid; /* Saved effective group id. */ ! 299: int p_refcnt; /* Number of references. */ ! 300: }; ! 301: ! 302: #define pcred_readlock(p) lockmgr(&(p)->p_cred->pc_lock, \ ! 303: LK_SHARED, 0, (p)) ! 304: #define pcred_writelock(p) lockmgr(&(p)->p_cred->pc_lock, \ ! 305: LK_EXCLUSIVE, 0, (p)) ! 306: #define pcred_unlock(p) lockmgr(&(p)->p_cred->pc_lock, \ ! 307: LK_RELEASE, 0, (p)) ! 308: ! 309: #ifdef KERNEL ! 310: ! 311: __BEGIN_DECLS ! 312: /* ! 313: * We use process IDs <= PID_MAX; PID_MAX + 1 must also fit in a pid_t, ! 314: * as it is used to represent "no process group". ! 315: */ ! 316: #define PID_MAX 30000 ! 317: #define NO_PID 30001 ! 318: ! 319: #define SESS_LEADER(p) ((p)->p_session->s_leader == (p)) ! 320: #define SESSHOLD(s) ((s)->s_count++) ! 321: #define SESSRELE(s) sessrele(s) ! 322: ! 323: #define PIDHASH(pid) (&pidhashtbl[(pid) & pidhash]) ! 324: extern LIST_HEAD(pidhashhead, proc) *pidhashtbl; ! 325: extern u_long pidhash; ! 326: ! 327: #define PGRPHASH(pgid) (&pgrphashtbl[(pgid) & pgrphash]) ! 328: extern LIST_HEAD(pgrphashhead, pgrp) *pgrphashtbl; ! 329: extern u_long pgrphash; ! 330: ! 331: extern int nprocs, maxproc; /* Current and max number of procs. */ ! 332: ! 333: LIST_HEAD(proclist, proc); ! 334: extern struct proclist allproc; /* List of all processes. */ ! 335: extern struct proclist zombproc; /* List of zombie processes. */ ! 336: extern struct proc *initproc, *kernproc; ! 337: ! 338: extern struct proc *pfind __P((pid_t)); /* Find process by id. */ ! 339: extern struct pgrp *pgfind __P((pid_t)); /* Find process group by id. */ ! 340: ! 341: extern int chgproccnt __P((uid_t uid, int diff)); ! 342: extern int enterpgrp __P((struct proc *p, pid_t pgid, int mksess)); ! 343: extern void fixjobc __P((struct proc *p, struct pgrp *pgrp, int entering)); ! 344: extern int inferior __P((struct proc *p)); ! 345: extern int leavepgrp __P((struct proc *p)); ! 346: extern void mi_switch __P((void)); ! 347: extern void pgdelete __P((struct pgrp *pgrp)); ! 348: extern void sessrele __P((struct session *sess)); ! 349: extern void procinit __P((void)); ! 350: extern void resetpriority __P((struct proc *)); ! 351: extern void setrunnable __P((struct proc *)); ! 352: extern void setrunqueue __P((struct proc *)); ! 353: extern int sleep __P((void *chan, int pri)); ! 354: extern int tsleep __P((void *chan, int pri, char *wmesg, int timo)); ! 355: extern int tsleep0 __P((void *chan, int pri, char *wmesg, int timo, int (*continuation)(int) )); ! 356: extern void unsleep __P((struct proc *)); ! 357: extern void wakeup __P((void *chan)); ! 358: __END_DECLS ! 359: ! 360: #endif /* KERNEL */ ! 361: ! 362: #endif /* !_SYS_PROC_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.