1 @c -*- mode: texinfo -*-
2 @deftypefn Extension {struct pex_obj *} pex_init (int @var{flags}, const char *@var{pname}, const char *@var{tempbase})
4 Prepare to execute one or more programs, with standard output of each
5 program fed to standard input of the next. This is a system
6 independent interface to execute a pipeline.
8 @var{flags} is a bitwise combination of the following:
12 @vindex PEX_RECORD_TIMES
13 @item PEX_RECORD_TIMES
14 Record subprocess times if possible.
18 Use pipes for communication between processes, if possible.
20 @vindex PEX_SAVE_TEMPS
22 Don't delete temporary files used for communication between
27 @var{pname} is the name of program to be executed, used in error
28 messages. @var{tempbase} is a base name to use for any required
29 temporary files; it may be @code{NULL} to use a randomly chosen name.
33 @deftypefn Extension {const char *} pex_run (struct pex_obj *@var{obj}, int @var{flags}, const char *@var{executable}, char * const *@var{argv}, const char *@var{outname}, const char *@var{errname}, int *@var{err})
35 Execute one program in a pipeline. On success this returns
36 @code{NULL}. On failure it returns an error message, a statically
39 @var{obj} is returned by a previous call to @code{pex_init}.
41 @var{flags} is a bitwise combination of the following:
47 This must be set on the last program in the pipeline. In particular,
48 it should be set when executing a single program. The standard output
49 of the program will be sent to @var{outname}, or, if @var{outname} is
50 @code{NULL}, to the standard output of the calling program. Do @emph{not}
51 set this bit if you want to call @code{pex_read_output}
52 (described below). After a call to @code{pex_run} with this bit set,
53 @var{pex_run} may no longer be called with the same @var{obj}.
57 Search for the program using the user's executable search path.
61 @var{outname} is a suffix. See the description of @var{outname},
64 @vindex PEX_STDERR_TO_STDOUT
65 @item PEX_STDERR_TO_STDOUT
66 Send the program's standard error to standard output, if possible.
68 @vindex PEX_BINARY_INPUT
69 @vindex PEX_BINARY_OUTPUT
70 @vindex PEX_BINARY_ERROR
71 @item PEX_BINARY_INPUT
72 @itemx PEX_BINARY_OUTPUT
73 @itemx PEX_BINARY_ERROR
74 The standard input (output or error) of the program should be read (written) in
75 binary mode rather than text mode. These flags are ignored on systems
76 which do not distinguish binary mode and text mode, such as Unix. For
77 proper behavior these flags should match appropriately---a call to
78 @code{pex_run} using @code{PEX_BINARY_OUTPUT} should be followed by a
79 call using @code{PEX_BINARY_INPUT}.
81 @vindex PEX_STDERR_TO_PIPE
82 @item PEX_STDERR_TO_PIPE
83 Send the program's standard error to a pipe, if possible. This flag
84 cannot be specified together with @code{PEX_STDERR_TO_STDOUT}. This
85 flag can be specified only on the last program in pipeline.
89 @var{executable} is the program to execute. @var{argv} is the set of
90 arguments to pass to the program; normally @code{@var{argv}[0]} will
91 be a copy of @var{executable}.
93 @var{outname} is used to set the name of the file to use for standard
94 output. There are two cases in which no output file will be used:
98 if @code{PEX_LAST} is not set in @var{flags}, and @code{PEX_USE_PIPES}
99 was set in the call to @code{pex_init}, and the system supports pipes
102 if @code{PEX_LAST} is set in @var{flags}, and @var{outname} is
107 Otherwise the code will use a file to hold standard
108 output. If @code{PEX_LAST} is not set, this file is considered to be
109 a temporary file, and it will be removed when no longer needed, unless
110 @code{PEX_SAVE_TEMPS} was set in the call to @code{pex_init}.
112 There are two cases to consider when setting the name of the file to
113 hold standard output.
117 @code{PEX_SUFFIX} is set in @var{flags}. In this case
118 @var{outname} may not be @code{NULL}. If the @var{tempbase} parameter
119 to @code{pex_init} was not @code{NULL}, then the output file name is
120 the concatenation of @var{tempbase} and @var{outname}. If
121 @var{tempbase} was @code{NULL}, then the output file name is a random
122 file name ending in @var{outname}.
125 @code{PEX_SUFFIX} was not set in @var{flags}. In this
126 case, if @var{outname} is not @code{NULL}, it is used as the output
127 file name. If @var{outname} is @code{NULL}, and @var{tempbase} was
128 not NULL, the output file name is randomly chosen using
129 @var{tempbase}. Otherwise the output file name is chosen completely
133 @var{errname} is the file name to use for standard error output. If
134 it is @code{NULL}, standard error is the same as the caller's.
135 Otherwise, standard error is written to the named file.
137 On an error return, the code sets @code{*@var{err}} to an @code{errno}
138 value, or to 0 if there is no relevant @code{errno}.
142 @deftypefn Extension {const char *} pex_run_in_environment (struct pex_obj *@var{obj}, int @var{flags}, const char *@var{executable}, char * const *@var{argv}, char * const *@var{env}, int @var{env_size}, const char *@var{outname}, const char *@var{errname}, int *@var{err})
144 Execute one program in a pipeline, permitting the environment for the
145 program to be specified. Behaviour and parameters not listed below are
146 as for @code{pex_run}.
148 @var{env} is the environment for the child process, specified as an array of
149 character pointers. Each element of the array should point to a string of the
150 form @code{VAR=VALUE}, with the exception of the last element that must be
155 @deftypefn Extension {FILE *} pex_input_file (struct pex_obj *@var{obj}, int @var{flags}, const char *@var{in_name})
157 Return a stream for a temporary file to pass to the first program in
158 the pipeline as input.
160 The name of the input file is chosen according to the same rules
161 @code{pex_run} uses to choose output file names, based on
162 @var{in_name}, @var{obj} and the @code{PEX_SUFFIX} bit in @var{flags}.
164 Don't call @code{fclose} on the returned stream; the first call to
165 @code{pex_run} closes it automatically.
167 If @var{flags} includes @code{PEX_BINARY_OUTPUT}, open the stream in
168 binary mode; otherwise, open it in the default mode. Including
169 @code{PEX_BINARY_OUTPUT} in @var{flags} has no effect on Unix.
172 @deftypefn Extension {FILE *} pex_input_pipe (struct pex_obj *@var{obj}, int @var{binary})
174 Return a stream @var{fp} for a pipe connected to the standard input of
175 the first program in the pipeline; @var{fp} is opened for writing.
176 You must have passed @code{PEX_USE_PIPES} to the @code{pex_init} call
177 that returned @var{obj}.
179 You must close @var{fp} using @code{fclose} yourself when you have
180 finished writing data to the pipeline.
182 The file descriptor underlying @var{fp} is marked not to be inherited
185 On systems that do not support pipes, this function returns
186 @code{NULL}, and sets @code{errno} to @code{EINVAL}. If you would
187 like to write code that is portable to all systems the @code{pex}
188 functions support, consider using @code{pex_input_file} instead.
190 There are two opportunities for deadlock using
191 @code{pex_input_pipe}:
195 Most systems' pipes can buffer only a fixed amount of data; a process
196 that writes to a full pipe blocks. Thus, if you write to @file{fp}
197 before starting the first process, you run the risk of blocking when
198 there is no child process yet to read the data and allow you to
199 continue. @code{pex_input_pipe} makes no promises about the
200 size of the pipe's buffer, so if you need to write any data at all
201 before starting the first process in the pipeline, consider using
202 @code{pex_input_file} instead.
205 Using @code{pex_input_pipe} and @code{pex_read_output} together
206 may also cause deadlock. If the output pipe fills up, so that each
207 program in the pipeline is waiting for the next to read more data, and
208 you fill the input pipe by writing more data to @var{fp}, then there
209 is no way to make progress: the only process that could read data from
210 the output pipe is you, but you are blocked on the input pipe.
216 @deftypefn Extension {FILE *} pex_read_output (struct pex_obj *@var{obj}, int @var{binary})
218 Returns a @code{FILE} pointer which may be used to read the standard
219 output of the last program in the pipeline. When this is used,
220 @code{PEX_LAST} should not be used in a call to @code{pex_run}. After
221 this is called, @code{pex_run} may no longer be called with the same
222 @var{obj}. @var{binary} should be non-zero if the file should be
223 opened in binary mode. Don't call @code{fclose} on the returned file;
224 it will be closed by @code{pex_free}.
228 @deftypefn Extension {FILE *} pex_read_err (struct pex_obj *@var{obj}, int @var{binary})
230 Returns a @code{FILE} pointer which may be used to read the standard
231 error of the last program in the pipeline. When this is used,
232 @code{PEX_LAST} should not be used in a call to @code{pex_run}. After
233 this is called, @code{pex_run} may no longer be called with the same
234 @var{obj}. @var{binary} should be non-zero if the file should be
235 opened in binary mode. Don't call @code{fclose} on the returned file;
236 it will be closed by @code{pex_free}.
241 @deftypefn Extension int pex_get_status (struct pex_obj *@var{obj}, int @var{count}, int *@var{vector})
243 Returns the exit status of all programs run using @var{obj}.
244 @var{count} is the number of results expected. The results will be
245 placed into @var{vector}. The results are in the order of the calls
246 to @code{pex_run}. Returns 0 on error, 1 on success.
250 @deftypefn Extension int pex_get_times (struct pex_obj *@var{obj}, int @var{count}, struct pex_time *@var{vector})
252 Returns the process execution times of all programs run using
253 @var{obj}. @var{count} is the number of results expected. The
254 results will be placed into @var{vector}. The results are in the
255 order of the calls to @code{pex_run}. Returns 0 on error, 1 on
258 @code{struct pex_time} has the following fields of the type
259 @code{unsigned long}: @code{user_seconds},
260 @code{user_microseconds}, @code{system_seconds},
261 @code{system_microseconds}. On systems which do not support reporting
262 process times, all the fields will be set to @code{0}.
266 @deftypefn Extension void pex_free (struct pex_obj @var{obj})
268 Clean up and free all data associated with @var{obj}. If you have not
269 yet called @code{pex_get_times} or @code{pex_get_status}, this will
270 try to kill the subprocesses.
274 @deftypefn Extension {const char *} pex_one (int @var{flags}, const char *@var{executable}, char * const *@var{argv}, const char *@var{pname}, const char *@var{outname}, const char *@var{errname}, int *@var{status}, int *@var{err})
276 An interface to permit the easy execution of a
277 single program. The return value and most of the parameters are as
278 for a call to @code{pex_run}. @var{flags} is restricted to a
279 combination of @code{PEX_SEARCH}, @code{PEX_STDERR_TO_STDOUT}, and
280 @code{PEX_BINARY_OUTPUT}. @var{outname} is interpreted as if
281 @code{PEX_LAST} were set. On a successful return, @code{*@var{status}} will
282 be set to the exit status of the program.
286 @deftypefn Extension int pexecute (const char *@var{program}, char * const *@var{argv}, const char *@var{this_pname}, const char *@var{temp_base}, char **@var{errmsg_fmt}, char **@var{errmsg_arg}, int @var{flags})
288 This is the old interface to execute one or more programs. It is
289 still supported for compatibility purposes, but is no longer
294 @deftypefn Extension int pwait (int @var{pid}, int *@var{status}, int @var{flags})
296 Another part of the old execution interface.