xref: /original-bsd/sys/sys/proc.h (revision 972e85c3)
1 /*
2  * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)proc.h	7.17 (Berkeley) 05/23/90
7  */
8 
9 /*
10  * One structure allocated per session.
11  */
12 struct	session {
13 	int	s_count;	/* ref cnt; pgrps in session */
14 	struct	proc *s_leader;	/* session leader */
15 	struct	vnode *s_ttyvp;	/* vnode of controlling terminal */
16 	struct	tty *s_ttyp;	/* controlling terminal */
17 };
18 
19 /*
20  * One structure allocated per process group.
21  */
22 struct	pgrp {
23 	struct	pgrp *pg_hforw;	/* forward link in hash bucket */
24 	struct	proc *pg_mem;	/* pointer to pgrp members */
25 	struct	session *pg_session;	/* pointer to session */
26 	pid_t	pg_id;		/* pgrp id */
27 	int	pg_jobc;	/* # procs qualifying pgrp for job control */
28 };
29 
30 /*
31  * One structure allocated per active
32  * process. It contains all data needed
33  * about the process while the
34  * process may be swapped out.
35  * Other per process data (user.h)
36  * is swapped with the process.
37  */
38 
39 #define	MAXCOMLEN	16		/* <= MAXNAMLEN, >= sizeof(ac_comm) */
40 #define	MAXLOGNAME	12		/* >= UT_NAMESIZE */
41 
42 struct	proc {
43 	struct	proc *p_link;	/* linked list of running processes */
44 	struct	proc *p_rlink;
45 	struct	proc *p_nxt;	/* linked list of allocated proc slots */
46 	struct	proc **p_prev;		/* also zombies, and free proc's */
47 	struct	pte *p_addr;	/* u-area kernel map address */
48 	char	p_usrpri;	/* user-priority based on p_cpu and p_nice */
49 	char	p_pri;		/* priority, negative is high */
50 	char	p_cpu;		/* cpu usage for scheduling */
51 	char	p_stat;
52 	char	p_time;		/* resident time for scheduling */
53 	char	p_nice;		/* nice for cpu usage */
54 	char	p_slptime;	/* time since last block */
55 	char	p_cursig;
56 	int	p_sig;		/* signals pending to this process */
57 	int	p_sigmask;	/* current signal mask */
58 	int	p_sigignore;	/* signals being ignored */
59 	int	p_sigcatch;	/* signals being caught by user */
60 	int	p_flag;
61 	uid_t	p_uid;		/* effective user id */
62 	uid_t	p_ruid;		/* real user id */
63 	uid_t	p_svuid;	/* saved effective user id */
64 	gid_t	p_rgid;		/* real group id */
65 	gid_t	p_svgid;	/* saved effective group id */
66 	pid_t	p_pid;		/* unique process id */
67 	pid_t	p_ppid;		/* process id of parent */
68 	u_short	p_xstat;	/* Exit status for wait */
69 	struct	rusage *p_ru;	/* exit information */
70 	short	p_poip;		/* page outs in progress */
71 	short	p_szpt;		/* copy of page table size */
72 	segsz_t p_tsize;	/* size of text (clicks) */
73 	segsz_t p_dsize;	/* size of data space (clicks) */
74 	segsz_t p_mmsize;	/* size of mapmem beyond p_dsize (clicks) */
75 	segsz_t p_ssize;	/* copy of stack size (clicks) */
76 	segsz_t p_rssize; 	/* current resident set size in clicks */
77 	segsz_t p_maxrss;	/* copy of u.u_limit[MAXRSS] */
78 	segsz_t p_swrss;	/* resident set size before last swap */
79 	swblk_t	p_swaddr;	/* disk address of u area when swapped */
80 	caddr_t p_wchan;	/* event process is awaiting */
81 	struct	text *p_textp;	/* pointer to text structure */
82 	struct	pte *p_p0br;	/* page table base P0BR */
83 	struct	proc *p_xlink;	/* linked list of procs sharing same text */
84 	int	p_cpticks;	/* ticks of cpu time */
85 	fixpt_t	p_pctcpu;	/* %cpu for this process during p_time */
86 	short	p_ndx;		/* proc index for memall (because of vfork) */
87 	struct	proc *p_hash;	/* hashed based on p_pid for kill+exit+... */
88 	struct	proc *p_pptr;	/* pointer to process structure of parent */
89 	struct	proc *p_cptr;	/* pointer to youngest living child */
90 	struct	proc *p_osptr;	/* pointer to older sibling processes */
91 	struct	proc *p_ysptr;	/* pointer to younger siblings */
92 	struct 	pgrp *p_pgrp;	/* pointer to process group */
93 #define p_session p_pgrp->pg_session
94 #define p_pgid	p_pgrp->pg_id
95 	struct	proc *p_pgrpnxt; /* pointer to next process in process group */
96 	struct	itimerval p_realtimer;
97 	int	p_traceflag;	/* kernel trace points */
98 	struct	vnode *p_tracep;/* trace to vnode */
99 	char	p_comm[MAXCOMLEN+1];
100 	char	p_logname[MAXLOGNAME];
101 	char	*p_wmesg;
102 	struct	timeval p_utime; /* user time */
103 	struct	timeval p_stime; /* system time */
104 #if defined(tahoe)
105 	int	p_ckey;		/* code cache key */
106 	int	p_dkey;		/* data cache key */
107 #endif
108 };
109 
110 /*
111  * proc ops return arrays of augmented proc structures
112  */
113 struct kinfo_proc {
114 	struct	proc kp_proc;			/* proc structure */
115 	struct	eproc {
116 		struct	proc *e_paddr;		/* address of proc */
117 		struct	session *e_sess;	/* session pointer */
118 		pid_t	e_pgid;			/* process group id */
119 		short	e_jobc;			/* job control counter */
120 		dev_t	e_tdev;			/* controlling tty dev */
121 		pid_t	e_tpgid;		/* tty process group id */
122 		struct	session *e_tsess;	/* tty session pointer */
123 #define	WMESGLEN	7
124 		char	e_wmesg[WMESGLEN+1];	/* wchan message */
125 		segsz_t e_xsize;		/* text size */
126 		short	e_xrssize;		/* text rss */
127 		short	e_xccount;		/* text references */
128 		short	e_xswrss;
129 		long	e_flag;
130 #define	EPROC_CTTY	0x01	/* controlling tty vnode active */
131 #define	EPROC_SLEADER	0x02	/* session leader */
132 		long	e_spare[7];
133 	} kp_eproc;
134 };
135 
136 #ifdef KERNEL
137 #define	PIDHASH(pid)	((pid) & pidhashmask)
138 extern	int pidhashmask;		/* in param.c */
139 extern	struct proc *pidhash[];		/* in param.c */
140 struct	proc *pfind();			/* find process by id */
141 extern	struct pgrp *pgrphash[];	/* in param.c */
142 struct 	pgrp *pgfind();			/* find process group by id */
143 struct	proc *proc, *procNPROC;		/* the proc table itself */
144 struct	proc *freeproc, *zombproc, *allproc;
145 					/* lists of procs in various states */
146 int	nproc;
147 
148 #define	NQS	32		/* 32 run queues */
149 struct	prochd {
150 	struct	proc *ph_link;	/* linked list of running processes */
151 	struct	proc *ph_rlink;
152 } qs[NQS];
153 int	whichqs;		/* bit mask summarizing non-empty qs's */
154 
155 #define SESS_LEADER(p)	((p)->p_session->s_leader == (p))
156 #define	SESSHOLD(s)	((s)->s_count++)
157 #define	SESSRELE(s)	{ \
158 		if (--(s)->s_count == 0) \
159 			FREE(s, M_SESSION); \
160 		}
161 #endif
162 
163 /* stat codes */
164 #define	SSLEEP	1		/* awaiting an event */
165 #define	SWAIT	2		/* (abandoned state) */
166 #define	SRUN	3		/* running */
167 #define	SIDL	4		/* intermediate state in process creation */
168 #define	SZOMB	5		/* intermediate state in process termination */
169 #define	SSTOP	6		/* process being traced */
170 
171 /* flag codes */
172 #define	SLOAD	0x0000001	/* in core */
173 #define	SSYS	0x0000002	/* swapper or pager process */
174 #define	SLOCK	0x0000004	/* process being swapped out */
175 #define	SSWAP	0x0000008	/* save area flag */
176 #define	STRC	0x0000010	/* process is being traced */
177 #define	SWTED	0x0000020	/* another tracing flag */
178 #define	SSINTR	0x0000040	/* sleep is interruptible */
179 #define	SPAGE	0x0000080	/* process in page wait state */
180 #define	SKEEP	0x0000100	/* another flag to prevent swap out */
181 #define	SOMASK	0x0000200	/* restore old mask after taking signal */
182 #define	SWEXIT	0x0000400	/* working on exiting */
183 #define	SPHYSIO	0x0000800	/* doing physical i/o */
184 #define	SVFORK	0x0001000	/* process resulted from vfork() */
185 #define	SVFDONE	0x0002000	/* another vfork flag */
186 #define	SNOVM	0x0004000	/* no vm, parent in a vfork() */
187 #define	SPAGV	0x0008000	/* init data space on demand, from vnode */
188 #define	SSEQL	0x0010000	/* user warned of sequential vm behavior */
189 #define	SUANOM	0x0020000	/* user warned of random vm behavior */
190 #define	STIMO	0x0040000	/* timing out during sleep */
191 #define	SNOCLDSTOP 0x0080000	/* no SIGCHLD when children stop */
192 #define	SCTTY	0x0100000	/* has a controlling terminal */
193 #define	SOWEUPC	0x0200000	/* owe process an addupc() call at next ast */
194 #define	SSEL	0x0400000	/* selecting; wakeup/waiting danger */
195 #define SEXEC	0x0800000	/* process called exec */
196 #define	SHPUX	0x1000000	/* HP-UX process (HPUXCOMPAT) */
197 #define	SULOCK	0x2000000	/* locked in core after swap error XXX */
198 #define	SPTECHG	0x4000000	/* pte's for process have changed XXX */
199