]>
git.saurik.com Git - apple/xnu.git/blob - bsd/sys/proc.h 
   2   * Copyright (c) 2000-2016 Apple Computer, Inc. All rights reserved.    4   * @APPLE_OSREFERENCE_LICENSE_HEADER_START@    6   * This file contains Original Code and/or Modifications of Original Code    7   * as defined in and that are subject to the Apple Public Source License    8   * Version 2.0 (the 'License'). You may not use this file except in    9   * compliance with the License. The rights granted to you under the License   10   * may not be used to create, or enable the creation or redistribution of,   11   * unlawful or unlicensed copies of an Apple operating system, or to   12   * circumvent, violate, or enable the circumvention or violation of, any   13   * terms of an Apple operating system software license agreement.   15   * Please obtain a copy of the License at   16   * http://www.opensource.apple.com/apsl/ and read it before using this file.   18   * The Original Code and all software distributed under the License are   19   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER   20   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,   21   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,   22   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.   23   * Please see the License for the specific language governing rights and   24   * limitations under the License.   26   * @APPLE_OSREFERENCE_LICENSE_HEADER_END@   28  /* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */   30   * Copyright (c) 1986, 1989, 1991, 1993   31   *      The Regents of the University of California.  All rights reserved.   32   * (c) UNIX System Laboratories, Inc.   33   * All or some portions of this file are derived from material licensed   34   * to the University of California by American Telephone and Telegraph   35   * Co. or Unix System Laboratories, Inc. and are reproduced herein with   36   * the permission of UNIX System Laboratories, Inc.   38   * Redistribution and use in source and binary forms, with or without   39   * modification, are permitted provided that the following conditions   41   * 1. Redistributions of source code must retain the above copyright   42   *    notice, this list of conditions and the following disclaimer.   43   * 2. Redistributions in binary form must reproduce the above copyright   44   *    notice, this list of conditions and the following disclaimer in the   45   *    documentation and/or other materials provided with the distribution.   46   * 3. All advertising materials mentioning features or use of this software   47   *    must display the following acknowledgement:   48   *      This product includes software developed by the University of   49   *      California, Berkeley and its contributors.   50   * 4. Neither the name of the University nor the names of its contributors   51   *    may be used to endorse or promote products derived from this software   52   *    without specific prior written permission.   54   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND   55   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE   56   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE   57   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE   58   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL   59   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS   60   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)   61   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT   62   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY   63   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF   66   *      @(#)proc.h      8.15 (Berkeley) 5/19/95   72  #include <sys/appleapiopts.h>   73  #include <sys/cdefs.h>   74  #include <sys/select.h>                  /* For struct selinfo. */   75  #include <sys/queue.h>   77  #include <sys/param.h>   78  #include <sys/event.h>   81  #include <sys/kernel_types.h>   82  #include <uuid/uuid.h>   84  #include <mach/boolean.h>   86  #ifdef XNU_KERNEL_PRIVATE   87  #include <mach/coalition.h>              /* COALITION_NUM_TYPES */   90  #if defined(XNU_KERNEL_PRIVATE) || !defined(KERNEL)   96  /* Exported fields for kern sysctls */  100                          struct   proc 
* __p_forw
;  /* Doubly-linked run/sleep queue. */  101                          struct   proc 
* __p_back
;  103                  struct  timeval __p_starttime
;    /* process start time */  105  #define p_forw p_un.p_st1.__p_forw  106  #define p_back p_un.p_st1.__p_back  107  #define p_starttime p_un.__p_starttime  108          struct   vmspace 
* p_vmspace
;      /* Address space. */  109          struct   sigacts 
* p_sigacts
;      /* Signal actions, state (PROC ONLY). */  110          int      p_flag
;                  /* P_* flags. */  111          char     p_stat
;                  /* S* process status. */  112          pid_t   p_pid
;                   /* Process identifier. */  113          pid_t   p_oppid
;          /* Save parent pid during ptrace. XXX */  114          int      p_dupfd
;          /* Sideways return value from fdopen. XXX */  116          caddr_t user_stack
;      /* where user stack was allocated */  117          void     * exit_thread
;    /* XXX Which thread is exiting? */  118          int              p_debugger
;              /* allow to debug */  119          boolean_t       sigwait
;         /* indication to suspend */  121          u_int   p_estcpu
;         /* Time averaged value of p_cpticks. */  122          int      p_cpticks
;        /* Ticks of cpu time. */  123          fixpt_t p_pctcpu
;         /* %cpu for this process during p_swtime */  124          void     * p_wchan
;         /* Sleep address. */  125          char     * p_wmesg
;         /* Reason for sleep. */  126          u_int   p_swtime
;         /* Time swapped in or out. */  127          u_int   p_slptime
;        /* Time since last blocked. */  128          struct   itimerval p_realtimer
;   /* Alarm timer. */  129          struct   timeval p_rtime
;         /* Real time. */  130          u_quad_t p_uticks
;               /* Statclock hits in user mode. */  131          u_quad_t p_sticks
;               /* Statclock hits in system mode. */  132          u_quad_t p_iticks
;               /* Statclock hits processing intr. */  133          int      p_traceflag
;             /* Kernel trace points. */  134          struct   vnode 
* p_tracep
;         /* Trace to vnode. */  135          int      p_siglist
;               /* DEPRECATED. */  136          struct   vnode 
* p_textvp
;         /* Vnode of executable. */  137          int      p_holdcnt
;               /* If non-zero, don't swap. */  138          sigset_t p_sigmask
;      /* DEPRECATED. */  139          sigset_t p_sigignore
;    /* Signals being ignored. */  140          sigset_t p_sigcatch
;     /* Signals being caught by user. */  141          u_char  p_priority
;      /* Process priority. */  142          u_char  p_usrpri
;        /* User-priority based on p_cpu and p_nice. */  143          char     p_nice
;          /* Process "nice" value. */  144          char     p_comm
[ MAXCOMLEN
+ 1 ];  145          struct   pgrp 
* p_pgrp
;    /* Pointer to process group. */  146          struct   user 
* p_addr
;    /* Kernel virtual addr of u-area (PROC ONLY). */  147          u_short p_xstat
;         /* Exit status for wait; also stop signal. */  148          u_short p_acflag
;        /* Accounting flags. */  149          struct   rusage 
* p_ru
;    /* Exit information. XXX */  154  #define SIDL    1                /* Process being created by fork. */  155  #define SRUN    2                /* Currently runnable. */  156  #define SSLEEP  3                /* Sleeping on an address. */  157  #define SSTOP   4                /* Process debugging or suspension. */  158  #define SZOMB   5                /* Awaiting collection by parent. */  160  /* These flags are kept in extern_proc.p_flag. */  161  #define P_ADVLOCK       0x00000001       /* Process may hold POSIX adv. lock */  162  #define P_CONTROLT      0x00000002       /* Has a controlling terminal */  163  #define P_LP64          0x00000004       /* Process is LP64 */  164  #define P_NOCLDSTOP     0x00000008       /* No SIGCHLD when children stop */  166  #define P_PPWAIT        0x00000010       /* Parent waiting for chld exec/exit */  167  #define P_PROFIL        0x00000020       /* Has started profiling */  168  #define P_SELECT        0x00000040       /* Selecting; wakeup/waiting danger */  169  #define P_CONTINUED     0x00000080       /* Process was stopped and continued */  171  #define P_SUGID         0x00000100       /* Has set privileges since last exec */  172  #define P_SYSTEM        0x00000200       /* Sys proc: no sigs, stats or swap */  173  #define P_TIMEOUT       0x00000400       /* Timing out during sleep */  174  #define P_TRACED        0x00000800       /* Debugged process being traced */  176  #define P_DISABLE_ASLR  0x00001000       /* Disable address space layout randomization */  177  #define P_WEXIT         0x00002000       /* Working on exiting */  178  #define P_EXEC          0x00004000       /* Process called exec. */  180  /* Should be moved to machine-dependent areas. */  181  #define P_OWEUPC        0x00008000       /* Owe process an addupc() call at next ast. */  183  #define P_AFFINITY      0x00010000       /* xxx */  184  #define P_TRANSLATED    0x00020000       /* xxx */  185  #define P_CLASSIC       P_TRANSLATED     /* xxx */  187  #define P_DELAYIDLESLEEP 0x00040000      /* Process is marked to delay idle sleep on disk IO */  188  #define P_CHECKOPENEVT  0x00080000       /* check if a vnode has the OPENEVT flag set on open */  190  #define P_DEPENDENCY_CAPABLE    0x00100000       /* process is ok to call vfs_markdependency() */  191  #define P_REBOOT        0x00200000       /* Process called reboot() */  192  #define P_RESV6         0x00400000       /* used to be P_TBE */  193  #define P_RESV7         0x00800000       /* (P_SIGEXC)signal exceptions */  195  #define P_THCWD         0x01000000       /* process has thread cwd  */  196  #define P_RESV9         0x02000000       /* (P_VFORK)process has vfork children */  197  #define P_ADOPTPERSONA  0x04000000       /* process adopted a persona (used to be P_NOATTACH) */  198  #define P_RESV11        0x08000000       /* (P_INVFORK) proc in vfork */  200  #define P_NOSHLIB       0x10000000       /* no shared libs are in use for proc */  201                                          /* flag set on exec */  202  #define P_FORCEQUOTA    0x20000000       /* Force quota for root */  203  #define P_NOCLDWAIT     0x40000000       /* No zombies when chil procs exit */  204  #define P_NOREMOTEHANG  0x80000000       /* Don't hang on remote FS ops */  206  #define P_INMEM         0                /* Obsolete: retained for compilation */  207  #define P_NOSWAP        0                /* Obsolete: retained for compilation */  208  #define P_PHYSIO        0                /* Obsolete: retained for compilation */  209  #define P_FSTRACE       0                /* Obsolete: retained for compilation */  210  #define P_SSTEP         0                /* Obsolete: retained for compilation */  212  #define P_DIRTY_TRACK                           0x00000001       /* track dirty state */  213  #define P_DIRTY_ALLOW_IDLE_EXIT                 0x00000002       /* process can be idle-exited when clean */  214  #define P_DIRTY_DEFER                           0x00000004       /* defer initial opt-in to idle-exit */  215  #define P_DIRTY                                 0x00000008       /* process is dirty */  216  #define P_DIRTY_SHUTDOWN                        0x00000010       /* process is dirty during shutdown */  217  #define P_DIRTY_TERMINATED                      0x00000020       /* process has been marked for termination */  218  #define P_DIRTY_BUSY                            0x00000040       /* serialization flag */  219  #define P_DIRTY_MARKED                          0x00000080       /* marked dirty previously */  220  #define P_DIRTY_AGING_IN_PROGRESS               0x00000100       /* aging in one of the 'aging bands' */  221  #define P_DIRTY_LAUNCH_IN_PROGRESS              0x00000200       /* launch is in progress */  223  #define P_DIRTY_IS_DIRTY                        (P_DIRTY | P_DIRTY_SHUTDOWN)  224  #define P_DIRTY_IDLE_EXIT_ENABLED               (P_DIRTY_TRACK|P_DIRTY_ALLOW_IDLE_EXIT)  226  #endif  /* XNU_KERNEL_PRIVATE || !KERNEL */  231  extern  proc_t kernproc
;  233  extern  int  proc_is_classic ( proc_t p
);  234  proc_t 
current_proc_EXTERNAL ( void );  236  extern  int       msleep ( void  * chan
,  lck_mtx_t 
* mtx
,  int  pri
,  const char  * wmesg
,  struct  timespec 
*  ts 
);  237  extern  void      wakeup ( void  * chan
);  238  extern  void  wakeup_one ( caddr_t chan
);  241  /* this routine returns the pid of the current process */  242  extern  int  proc_selfpid ( void );  243  /* this routine returns the pid of the parent of the current process */  244  extern  int  proc_selfppid ( void );  245  /* this routine returns the csflags of the current process */  246  extern  int  proc_selfcsflags ( void );  247  /* this routine returns sends a signal signum to the process identified by the pid */  248  extern  void  proc_signal ( int  pid
,  int  signum
);  249  /* this routine checks whether any signal identified by the mask are pending in the  process identified by the pid. The check is  on all threads of the process. */  250  extern  int  proc_issignal ( int  pid
,  sigset_t mask
);  251  /* this routine returns 1 if the pid1 is inferior of pid2 */  252  extern  int  proc_isinferior ( int  pid1
,  int  pid2
);  253  /* this routine copies the process's name of the executable to the passed in buffer. It  254   * is always null terminated. The size of the buffer is to be passed in as well. This  255   * routine is to be used typically for debugging  257  void  proc_name ( int  pid
,  char  *  buf
,  int  size
);  258  /* This routine is simillar to proc_name except it returns for current process */  259  void  proc_selfname ( char  *  buf
,  int  size
);  261  /* find a process with a given pid. This comes with a reference which needs to be dropped by proc_rele */  262  extern  proc_t 
proc_find ( int  pid
);  263  /* returns a handle to current process which is referenced. The reference needs to be dropped with proc_rele */  264  extern  proc_t 
proc_self ( void );  265  /* releases the held reference on the process */  266  extern  int  proc_rele ( proc_t p
);  267  /* returns the pid of the given process */  268  extern  int  proc_pid ( proc_t
);  269  /* returns the pid of the parent of a given process */  270  extern  int  proc_ppid ( proc_t
);  271  /* returns 1 if the process is marked for no remote hangs */  272  extern  int  proc_noremotehang ( proc_t
);  273  /* returns 1 if the process is marked for force quota */  274  extern  int  proc_forcequota ( proc_t
);  275  /* returns 1 if the process is chrooted */  276  extern  int  proc_chrooted ( proc_t
);  278  /* this routine returns 1 if the process is running with 64bit address space, else 0 */  279  extern  int  proc_is64bit ( proc_t
);  280  /* is this process exiting? */  281  extern  int  proc_exiting ( proc_t
);  282  /* this routine returns error if the process is not one with super user privileges */  283  int  proc_suser ( proc_t p
);  284  /* returns the cred assicaited with the process; temporary api */  285  kauth_cred_t 
proc_ucred ( proc_t p
);  287  extern  int  proc_tbe ( proc_t
);  290   @function proc_selfpgrpid  291   @abstract Get the process group id for the current process, as with proc_pgrpid().  292   @return pgrpid of current process.  294  pid_t 
proc_selfpgrpid ( void );  297   @function proc_pgrpid  298   @abstract Get the process group id for the passed-in process.  299   @param p Process whose pgrpid to grab.  300   @return pgrpid for "p".  302  pid_t 
proc_pgrpid ( proc_t p
);  304  #ifdef KERNEL_PRIVATE  305  // mark a process as being allowed to call vfs_markdependency()  306  void  bsd_set_dependency_capable ( task_t task
);  308  static  inline  int  IS_64BIT_PROCESS ( __unused proc_t p
) {  return  0 ; }  310  extern  int  IS_64BIT_PROCESS ( proc_t
);  313  extern  int       tsleep ( void  * chan
,  int  pri
,  const char  * wmesg
,  int  timo
);  314  extern  int       msleep1 ( void  * chan
,  lck_mtx_t 
* mtx
,  int  pri
,  const char  * wmesg
,  u_int64_t timo
);  316  task_t 
proc_task ( proc_t
);  317  extern  int  proc_pidversion ( proc_t
);  318  extern  uint32_t  proc_persona_id ( proc_t
);  319  extern  uint32_t  proc_getuid ( proc_t
);  320  extern  uint32_t  proc_getgid ( proc_t
);  321  extern  int  proc_getcdhash ( proc_t
,  unsigned char  *);  324   @function    proc_pidbackgrounded  325   @abstract    KPI to determine if a process is currently backgrounded.  326   @discussion  The process may move into or out of background state at any time,  327                so be prepared for this value to be outdated immediately.  328   @param pid   PID of the process to be queried.  329   @param state Pointer to a value which will be set to 1 if the process  330                is currently backgrounded, 0 otherwise.  331   @return      ESRCH if pid cannot be found or has started exiting.  333                EINVAL if state is NULL.  335  extern  int  proc_pidbackgrounded ( pid_t pid
,  uint32_t *  state
);  338   * This returns an unique 64bit id of a given process.  339   * Caller needs to hold proper reference on the  340   * passed in process strucutre.  342  extern  uint64_t  proc_uniqueid ( proc_t
);  344  extern  void  proc_set_responsible_pid ( proc_t target_proc
,  pid_t responsible_pid
);  346  /* return 1 if process is forcing case-sensitive HFS+ access, 0 for default */  347  extern  int  proc_is_forcing_hfs_case_sensitivity ( proc_t
);  349  #endif  /* KERNEL_PRIVATE */  351  #ifdef XNU_KERNEL_PRIVATE  353  /* unique 64bit id for process's original parent */  354  extern  uint64_t  proc_puniqueid ( proc_t
);  356  extern  void  proc_getexecutableuuid ( proc_t
,  unsigned char  *,  unsigned long );  357  extern  int  proc_get_originatorbgstate ( uint32_t  * is_backgrounded
);  359  /* Kernel interface to get the uuid of the originator of the work.*/  360  extern  int  proc_pidoriginatoruuid ( uuid_t uuid_buf
,  uint32_t  buffersize
);  362  extern  uint64_t  proc_was_throttled ( proc_t
);  363  extern  uint64_t  proc_did_throttle ( proc_t
);  365  extern  void  proc_coalitionids ( proc_t
,  uint64_t  [ COALITION_NUM_TYPES
]);  367  #endif  /* XNU_KERNEL_PRIVATE*/  369  #ifdef KERNEL_PRIVATE  370  extern  vnode_t 
proc_getexecutablevnode ( proc_t
);  /* Returned with iocount, use vnode_put() to drop */  379  /* Values for pid_shutdown_sockets */  380  #define SHUTDOWN_SOCKET_LEVEL_DISCONNECT_SVC            0x00000001  381  #define SHUTDOWN_SOCKET_LEVEL_DISCONNECT_ALL            0x00000002  384  #define SHUTDOWN_SOCKET_LEVEL_DISCONNECT_INTERNAL       0x10000000  385  #define SHUTDOWN_SOCKET_LEVEL_NECP                      0x20000000  386  #define SHUTDOWN_SOCKET_LEVEL_CONTENT_FILTER            0x40000000  393  int  pid_suspend ( int  pid
);  394  int  pid_resume ( int  pid
);  396  #if defined(__arm__) || defined(__arm64__)  397  int  pid_hibernate ( int  pid
);  398  #endif  /* defined(__arm__) || defined(__arm64__)  */  399  int  pid_shutdown_sockets ( int  pid
,  int  level
);  400  int  pid_shutdown_networking ( int  pid
,  int  level
);  406  #endif   /* !_SYS_PROC_H_ */