1@c -*- mode: texinfo -*- 2@deftypefn Extension {struct pex_obj *} pex_init (int @var{flags}, const char *@var{pname}, const char *@var{tempbase}) 3 4Prepare to execute one or more programs, with standard output of each 5program fed to standard input of the next. This is a system 6independent interface to execute a pipeline. 7 8@var{flags} is a bitwise combination of the following: 9 10@table @code 11 12@vindex PEX_RECORD_TIMES 13@item PEX_RECORD_TIMES 14Record subprocess times if possible. 15 16@vindex PEX_USE_PIPES 17@item PEX_USE_PIPES 18Use pipes for communication between processes, if possible. 19 20@vindex PEX_SAVE_TEMPS 21@item PEX_SAVE_TEMPS 22Don't delete temporary files used for communication between 23processes. 24 25@end table 26 27@var{pname} is the name of program to be executed, used in error 28messages. @var{tempbase} is a base name to use for any required 29temporary files; it may be @code{NULL} to use a randomly chosen name. 30 31@end deftypefn 32 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}) 34 35Execute one program in a pipeline. On success this returns 36@code{NULL}. On failure it returns an error message, a statically 37allocated string. 38 39@var{obj} is returned by a previous call to @code{pex_init}. 40 41@var{flags} is a bitwise combination of the following: 42 43@table @code 44 45@vindex PEX_LAST 46@item PEX_LAST 47This must be set on the last program in the pipeline. In particular, 48it should be set when executing a single program. The standard output 49of 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} 51set 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}. 54 55@vindex PEX_SEARCH 56@item PEX_SEARCH 57Search for the program using the user's executable search path. 58 59@vindex PEX_SUFFIX 60@item PEX_SUFFIX 61@var{outname} is a suffix. See the description of @var{outname}, 62below. 63 64@vindex PEX_STDERR_TO_STDOUT 65@item PEX_STDERR_TO_STDOUT 66Send the program's standard error to standard output, if possible. 67 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 74The standard input (output or error) of the program should be read (written) in 75binary mode rather than text mode. These flags are ignored on systems 76which do not distinguish binary mode and text mode, such as Unix. For 77proper behavior these flags should match appropriately---a call to 78@code{pex_run} using @code{PEX_BINARY_OUTPUT} should be followed by a 79call using @code{PEX_BINARY_INPUT}. 80 81@vindex PEX_STDERR_TO_PIPE 82@item PEX_STDERR_TO_PIPE 83Send the program's standard error to a pipe, if possible. This flag 84cannot be specified together with @code{PEX_STDERR_TO_STDOUT}. This 85flag can be specified only on the last program in pipeline. 86 87@end table 88 89@var{executable} is the program to execute. @var{argv} is the set of 90arguments to pass to the program; normally @code{@var{argv}[0]} will 91be a copy of @var{executable}. 92 93@var{outname} is used to set the name of the file to use for standard 94output. There are two cases in which no output file will be used: 95 96@enumerate 97@item 98if @code{PEX_LAST} is not set in @var{flags}, and @code{PEX_USE_PIPES} 99was set in the call to @code{pex_init}, and the system supports pipes 100 101@item 102if @code{PEX_LAST} is set in @var{flags}, and @var{outname} is 103@code{NULL} 104@end enumerate 105 106@noindent 107Otherwise the code will use a file to hold standard 108output. If @code{PEX_LAST} is not set, this file is considered to be 109a 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}. 111 112There are two cases to consider when setting the name of the file to 113hold standard output. 114 115@enumerate 116@item 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 119to @code{pex_init} was not @code{NULL}, then the output file name is 120the concatenation of @var{tempbase} and @var{outname}. If 121@var{tempbase} was @code{NULL}, then the output file name is a random 122file name ending in @var{outname}. 123 124@item 125@code{PEX_SUFFIX} was not set in @var{flags}. In this 126case, if @var{outname} is not @code{NULL}, it is used as the output 127file name. If @var{outname} is @code{NULL}, and @var{tempbase} was 128not NULL, the output file name is randomly chosen using 129@var{tempbase}. Otherwise the output file name is chosen completely 130at random. 131@end enumerate 132 133@var{errname} is the file name to use for standard error output. If 134it is @code{NULL}, standard error is the same as the caller's. 135Otherwise, standard error is written to the named file. 136 137On an error return, the code sets @code{*@var{err}} to an @code{errno} 138value, or to 0 if there is no relevant @code{errno}. 139 140@end deftypefn 141 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}) 143 144Execute one program in a pipeline, permitting the environment for the 145program to be specified. Behaviour and parameters not listed below are 146as for @code{pex_run}. 147 148@var{env} is the environment for the child process, specified as an array of 149character pointers. Each element of the array should point to a string of the 150form @code{VAR=VALUE}, with the exception of the last element that must be 151@code{NULL}. 152 153@end deftypefn 154 155@deftypefn Extension {FILE *} pex_input_file (struct pex_obj *@var{obj}, int @var{flags}, const char *@var{in_name}) 156 157Return a stream for a temporary file to pass to the first program in 158the pipeline as input. 159 160The 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}. 163 164Don't call @code{fclose} on the returned stream; the first call to 165@code{pex_run} closes it automatically. 166 167If @var{flags} includes @code{PEX_BINARY_OUTPUT}, open the stream in 168binary mode; otherwise, open it in the default mode. Including 169@code{PEX_BINARY_OUTPUT} in @var{flags} has no effect on Unix. 170@end deftypefn 171 172@deftypefn Extension {FILE *} pex_input_pipe (struct pex_obj *@var{obj}, int @var{binary}) 173 174Return a stream @var{fp} for a pipe connected to the standard input of 175the first program in the pipeline; @var{fp} is opened for writing. 176You must have passed @code{PEX_USE_PIPES} to the @code{pex_init} call 177that returned @var{obj}. 178 179You must close @var{fp} using @code{fclose} yourself when you have 180finished writing data to the pipeline. 181 182The file descriptor underlying @var{fp} is marked not to be inherited 183by child processes. 184 185On systems that do not support pipes, this function returns 186@code{NULL}, and sets @code{errno} to @code{EINVAL}. If you would 187like to write code that is portable to all systems the @code{pex} 188functions support, consider using @code{pex_input_file} instead. 189 190There are two opportunities for deadlock using 191@code{pex_input_pipe}: 192 193@itemize @bullet 194@item 195Most systems' pipes can buffer only a fixed amount of data; a process 196that writes to a full pipe blocks. Thus, if you write to @file{fp} 197before starting the first process, you run the risk of blocking when 198there is no child process yet to read the data and allow you to 199continue. @code{pex_input_pipe} makes no promises about the 200size of the pipe's buffer, so if you need to write any data at all 201before starting the first process in the pipeline, consider using 202@code{pex_input_file} instead. 203 204@item 205Using @code{pex_input_pipe} and @code{pex_read_output} together 206may also cause deadlock. If the output pipe fills up, so that each 207program in the pipeline is waiting for the next to read more data, and 208you fill the input pipe by writing more data to @var{fp}, then there 209is no way to make progress: the only process that could read data from 210the output pipe is you, but you are blocked on the input pipe. 211 212@end itemize 213 214@end deftypefn 215 216@deftypefn Extension {FILE *} pex_read_output (struct pex_obj *@var{obj}, int @var{binary}) 217 218Returns a @code{FILE} pointer which may be used to read the standard 219output 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 221this 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 223opened in binary mode. Don't call @code{fclose} on the returned file; 224it will be closed by @code{pex_free}. 225 226@end deftypefn 227 228 229@deftypefn Extension int pex_get_status (struct pex_obj *@var{obj}, int @var{count}, int *@var{vector}) 230 231Returns the exit status of all programs run using @var{obj}. 232@var{count} is the number of results expected. The results will be 233placed into @var{vector}. The results are in the order of the calls 234to @code{pex_run}. Returns 0 on error, 1 on success. 235 236@end deftypefn 237 238@deftypefn Extension int pex_get_times (struct pex_obj *@var{obj}, int @var{count}, struct pex_time *@var{vector}) 239 240Returns the process execution times of all programs run using 241@var{obj}. @var{count} is the number of results expected. The 242results will be placed into @var{vector}. The results are in the 243order of the calls to @code{pex_run}. Returns 0 on error, 1 on 244success. 245 246@code{struct pex_time} has the following fields of the type 247@code{unsigned long}: @code{user_seconds}, 248@code{user_microseconds}, @code{system_seconds}, 249@code{system_microseconds}. On systems which do not support reporting 250process times, all the fields will be set to @code{0}. 251 252@end deftypefn 253 254@deftypefn Extension void pex_free (struct pex_obj @var{obj}) 255 256Clean up and free all data associated with @var{obj}. 257 258@end deftypefn 259 260@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}) 261 262An interface to permit the easy execution of a 263single program. The return value and most of the parameters are as 264for a call to @code{pex_run}. @var{flags} is restricted to a 265combination of @code{PEX_SEARCH}, @code{PEX_STDERR_TO_STDOUT}, and 266@code{PEX_BINARY_OUTPUT}. @var{outname} is interpreted as if 267@code{PEX_LAST} were set. On a successful return, @code{*@var{status}} will 268be set to the exit status of the program. 269 270@end deftypefn 271 272@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}) 273 274This is the old interface to execute one or more programs. It is 275still supported for compatibility purposes, but is no longer 276documented. 277 278@end deftypefn 279 280@deftypefn Extension int pwait (int @var{pid}, int *@var{status}, int @var{flags}) 281 282Another part of the old execution interface. 283 284@end deftypefn 285