1 /* jobs.h -- structures and definitions used by the jobs.c file. */
3 /* Copyright (C) 1993-2019 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
21 #if !defined (_JOBS_H_)
29 #include "posixwait.h"
31 /* Defines controlling the fashion in which jobs are listed. */
32 #define JLIST_STANDARD 0
34 #define JLIST_PID_ONLY 2
35 #define JLIST_CHANGED_ONLY 3
36 #define JLIST_NONINTERACTIVE 4
38 /* I looked it up. For pretty_print_job (). The real answer is 24. */
39 #define LONGEST_SIGNAL_DESC 24
41 /* Defines for the wait_for_* functions and for the wait builtin to use */
42 #define JWAIT_PERROR (1 << 0)
43 #define JWAIT_FORCE (1 << 1)
44 #define JWAIT_NOWAIT (1 << 2) /* don't waitpid(), just return status if already exited */
45 #define JWAIT_WAITING (1 << 3) /* wait for jobs marked J_WAITING only */
47 /* flags for wait_for */
48 #define JWAIT_NOTERM (1 << 8) /* wait_for doesn't give terminal away */
50 /* The max time to sleep while retrying fork() on EAGAIN failure */
51 #define FORKSLEEP_MAX 16
53 /* We keep an array of jobs. Each entry in the array is a linked list
54 of processes that are piped together. The first process encountered is
57 /* Values for the `running' field of a struct process. */
63 /* Each child of the shell is remembered in a STRUCT PROCESS. A circular
64 chain of such structures is a pipeline. */
65 typedef struct process
{
66 struct process
*next
; /* Next process in the pipeline. A circular chain. */
67 pid_t pid
; /* Process ID. */
68 WAIT status
; /* The status of this command as returned by wait. */
69 int running
; /* Non-zero if this process is running. */
70 char *command
; /* The particular program that is running. */
73 struct pipeline_saver
{
74 struct process
*pipeline
;
75 struct pipeline_saver
*next
;
78 /* PALIVE really means `not exited' */
79 #define PSTOPPED(p) (WIFSTOPPED((p)->status))
80 #define PRUNNING(p) ((p)->running == PS_RUNNING)
81 #define PALIVE(p) (PRUNNING(p) || PSTOPPED(p))
83 #define PEXITED(p) ((p)->running == PS_DONE)
84 #if defined (RECYCLES_PIDS)
85 # define PRECYCLED(p) ((p)->running == PS_RECYCLED)
87 # define PRECYCLED(p) (0)
89 #define PDEADPROC(p) (PEXITED(p) || PRECYCLED(p))
91 #define get_job_by_jid(ind) (jobs[(ind)])
93 /* A description of a pipeline's state. */
94 typedef enum { JNONE
= -1, JRUNNING
= 1, JSTOPPED
= 2, JDEAD
= 4, JMIXED
= 8 } JOB_STATE
;
95 #define JOBSTATE(job) (jobs[(job)]->state)
96 #define J_JOBSTATE(j) ((j)->state)
98 #define STOPPED(j) (jobs[(j)]->state == JSTOPPED)
99 #define RUNNING(j) (jobs[(j)]->state == JRUNNING)
100 #define DEADJOB(j) (jobs[(j)]->state == JDEAD)
102 #define INVALID_JOB(j) ((j) < 0 || (j) >= js.j_jobslots || get_job_by_jid(j) == 0)
104 /* Values for the FLAGS field in the JOB struct below. */
105 #define J_FOREGROUND 0x01 /* Non-zero if this is running in the foreground. */
106 #define J_NOTIFIED 0x02 /* Non-zero if already notified about job state. */
107 #define J_JOBCONTROL 0x04 /* Non-zero if this job started under job control. */
108 #define J_NOHUP 0x08 /* Don't send SIGHUP to job if shell gets SIGHUP. */
109 #define J_STATSAVED 0x10 /* A process in this job had status saved via $! */
110 #define J_ASYNC 0x20 /* Job was started asynchronously */
111 #define J_PIPEFAIL 0x40 /* pipefail set when job was started */
112 #define J_WAITING 0x80 /* one of a list of jobs for which we are waiting */
114 #define IS_FOREGROUND(j) ((jobs[j]->flags & J_FOREGROUND) != 0)
115 #define IS_NOTIFIED(j) ((jobs[j]->flags & J_NOTIFIED) != 0)
116 #define IS_JOBCONTROL(j) ((jobs[j]->flags & J_JOBCONTROL) != 0)
117 #define IS_ASYNC(j) ((jobs[j]->flags & J_ASYNC) != 0)
118 #define IS_WAITING(j) ((jobs[j]->flags & J_WAITING) != 0)
121 char *wd
; /* The working directory at time of invocation. */
122 PROCESS
*pipe
; /* The pipeline of processes that make up this job. */
123 pid_t pgrp
; /* The process ID of the process group (necessary). */
124 JOB_STATE state
; /* The state that this job is in. */
125 int flags
; /* Flags word: J_NOTIFIED, J_FOREGROUND, or J_JOBCONTROL. */
126 #if defined (JOB_CONTROL)
127 COMMAND
*deferred
; /* Commands that will execute when this job is done. */
128 sh_vptrfunc_t
*j_cleanup
; /* Cleanup function to call when job marked JDEAD */
129 PTR_T cleanarg
; /* Argument passed to (*j_cleanup)() */
130 #endif /* JOB_CONTROL */
136 /* child process statistics */
137 int c_living
; /* running or stopped child processes */
138 int c_reaped
; /* exited child processes still in jobs list */
139 int c_injobs
; /* total number of child processes in jobs list */
140 /* child process totals */
141 int c_totforked
; /* total number of children this shell has forked */
142 int c_totreaped
; /* total number of children this shell has reaped */
143 /* job counters and indices */
144 int j_jobslots
; /* total size of jobs array */
145 int j_lastj
; /* last (newest) job allocated */
146 int j_firstj
; /* first (oldest) job allocated */
147 int j_njobs
; /* number of non-NULL jobs in jobs array */
148 int j_ndead
; /* number of JDEAD jobs in jobs array */
150 int j_current
; /* current job */
151 int j_previous
; /* previous job */
153 JOB
*j_lastmade
; /* last job allocated by stop_pipeline */
154 JOB
*j_lastasync
; /* last async job allocated by stop_pipeline */
157 /* Revised to accommodate new hash table bgpids implementation. */
158 typedef pid_t ps_index_t
;
161 ps_index_t bucket_next
;
162 ps_index_t bucket_prev
;
165 bits16_t status
; /* only 8 bits really needed */
169 struct pidstat
*storage
; /* storage arena */
177 #define NO_PIDSTAT (ps_index_t)-1
179 /* standalone process status struct, without bgpids indexes */
185 /* A standalone singly-linked list of PROCESS *, used in various places
186 including keeping track of process substitutions. */
193 #define NO_JOB -1 /* An impossible job array index. */
194 #define DUP_JOB -2 /* A possible return value for get_job_spec (). */
195 #define BAD_JOBSPEC -3 /* Bad syntax for job spec. */
197 /* A value which cannot be a process ID. */
198 #define NO_PID (pid_t)-1
200 #define ANY_PID (pid_t)-1
202 /* flags for make_child () */
203 #define FORK_SYNC 0 /* normal synchronous process */
204 #define FORK_ASYNC 1 /* background process */
205 #define FORK_NOJOB 2 /* don't put process in separate pgrp */
206 #define FORK_NOTERM 4 /* don't give terminal to any pgrp */
209 #if !defined (HAVE_UNISTD_H)
210 extern pid_t
fork (), getpid (), getpgrp ();
211 #endif /* !HAVE_UNISTD_H */
213 /* Stuff from the jobs.c file. */
214 extern struct jobstats js
;
216 extern pid_t original_pgrp
, shell_pgrp
, pipeline_pgrp
;
217 extern volatile pid_t last_made_pid
, last_asynchronous_pid
;
218 extern int asynchronous_notification
;
220 extern int already_making_children
;
221 extern int running_in_background
;
223 extern PROCESS
*last_procsub_child
;
227 extern void making_children
PARAMS((void));
228 extern void stop_making_children
PARAMS((void));
229 extern void cleanup_the_pipeline
PARAMS((void));
230 extern void discard_last_procsub_child
PARAMS((void));
231 extern void save_pipeline
PARAMS((int));
232 extern PROCESS
*restore_pipeline
PARAMS((int));
233 extern void start_pipeline
PARAMS((void));
234 extern int stop_pipeline
PARAMS((int, COMMAND
*));
235 extern int discard_pipeline
PARAMS((PROCESS
*));
236 extern void append_process
PARAMS((char *, pid_t
, int, int));
238 extern void save_proc_status
PARAMS((pid_t
, int));
240 extern PROCESS
*procsub_add
PARAMS((PROCESS
*));
241 extern PROCESS
*procsub_search
PARAMS((pid_t
));
242 extern PROCESS
*procsub_delete
PARAMS((pid_t
));
243 extern int procsub_waitpid
PARAMS((pid_t
));
244 extern void procsub_waitall
PARAMS((void));
245 extern void procsub_clear
PARAMS((void));
246 extern void procsub_prune
PARAMS((void));
248 extern void delete_job
PARAMS((int, int));
249 extern void nohup_job
PARAMS((int));
250 extern void delete_all_jobs
PARAMS((int));
251 extern void nohup_all_jobs
PARAMS((int));
253 extern int count_all_jobs
PARAMS((void));
255 extern void terminate_current_pipeline
PARAMS((void));
256 extern void terminate_stopped_jobs
PARAMS((void));
257 extern void hangup_all_jobs
PARAMS((void));
258 extern void kill_current_pipeline
PARAMS((void));
260 #if defined (__STDC__) && defined (pid_t)
261 extern int get_job_by_pid
PARAMS((int, int, PROCESS
**));
262 extern void describe_pid
PARAMS((int));
264 extern int get_job_by_pid
PARAMS((pid_t
, int, PROCESS
**));
265 extern void describe_pid
PARAMS((pid_t
));
268 extern void list_one_job
PARAMS((JOB
*, int, int, int));
269 extern void list_all_jobs
PARAMS((int));
270 extern void list_stopped_jobs
PARAMS((int));
271 extern void list_running_jobs
PARAMS((int));
273 extern pid_t make_child
PARAMS((char *, int));
275 extern int get_tty_state
PARAMS((void));
276 extern int set_tty_state
PARAMS((void));
278 extern int job_exit_status
PARAMS((int));
279 extern int job_exit_signal
PARAMS((int));
281 extern int wait_for_single_pid
PARAMS((pid_t
, int));
282 extern void wait_for_background_pids
PARAMS((struct procstat
*));
283 extern int wait_for
PARAMS((pid_t
, int));
284 extern int wait_for_job
PARAMS((int, int, struct procstat
*));
285 extern int wait_for_any_job
PARAMS((int, struct procstat
*));
287 extern void wait_sigint_cleanup
PARAMS((void));
289 extern void notify_and_cleanup
PARAMS((void));
290 extern void reap_dead_jobs
PARAMS((void));
291 extern int start_job
PARAMS((int, int));
292 extern int kill_pid
PARAMS((pid_t
, int, int));
293 extern int initialize_job_control
PARAMS((int));
294 extern void initialize_job_signals
PARAMS((void));
295 extern int give_terminal_to
PARAMS((pid_t
, int));
297 extern void run_sigchld_trap
PARAMS((int));
299 extern int freeze_jobs_list
PARAMS((void));
300 extern void unfreeze_jobs_list
PARAMS((void));
301 extern void set_jobs_list_frozen
PARAMS((int));
302 extern int set_job_control
PARAMS((int));
303 extern void without_job_control
PARAMS((void));
304 extern void end_job_control
PARAMS((void));
305 extern void restart_job_control
PARAMS((void));
306 extern void set_sigchld_handler
PARAMS((void));
307 extern void ignore_tty_job_signals
PARAMS((void));
308 extern void default_tty_job_signals
PARAMS((void));
309 extern void get_original_tty_job_signals
PARAMS((void));
311 extern void init_job_stats
PARAMS((void));
313 extern void close_pgrp_pipe
PARAMS((void));
314 extern void save_pgrp_pipe
PARAMS((int *, int));
315 extern void restore_pgrp_pipe
PARAMS((int *));
317 extern void set_maxchild
PARAMS((int));
319 extern int job_control
; /* set to 0 in nojobs.c */
321 #endif /* _JOBS_H_ */