subprocess 0.5.0
Modern subprocess library for c++
Loading...
Searching...
No Matches
ProcessBuilder.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <initializer_list>
4#include <vector>
5#include <string>
6#include <thread>
7
8#include "pipe.hpp"
9#include "PipeVar.hpp"
10
11namespace subprocess {
12
13 /* For reference:
14 0 - cin
15 1 - cout
16 2 - cerr
17 */
18 /* possible names:
19 PopenOptions,
20 RunDef,
21 RunConfig
22 RunOptions
23 */
24
86 class ProcessBuilder;
91 struct Popen {
92 public:
96 Popen(CommandLine command, const RunOptions& options);
98 Popen(CommandLine command, RunOptions&& options);
99 Popen(const Popen&)=delete;
100 Popen& operator=(const Popen&)=delete;
101
104
107
116
125
134
135
139 std::string cwd;
141
152 bool poll();
168 int wait(double timeout=-1);
182 bool send_signal(int signal);
184 bool terminate();
186 bool kill();
187
189 void close();
191 void close_cin() {
192 if (cin != kBadPipeValue) {
195 }
196 }
198 private:
199 void init(CommandLine& command, RunOptions& options);
200 /* In order to avoid deadlock across processes, a thread is used. A
201 reference to the thread is needed to wait for it to properly close
202 down and release the resources.
203 */
204 std::thread cin_thread;
205 std::thread cout_thread;
206 std::thread cerr_thread;
207#ifdef _WIN32
208 PROCESS_INFORMATION process_info;
209#endif
210 };
211
212
213
247
269 CompletedProcess run(Popen& popen, bool check=false);
280
282 struct RunBuilder {
285
290 RunBuilder(std::initializer_list<std::string> command) : command(command){}
292 RunBuilder& check(bool ch) {options.check = ch; return *this;}
294 RunBuilder& cin(const PipeVar& cin) {options.cin = cin; return *this;}
296 RunBuilder& cout(const PipeVar& cout) {options.cout = cout; return *this;}
298 RunBuilder& cerr(const PipeVar& cerr) {options.cerr = cerr; return *this;}
300 RunBuilder& cwd(std::string cwd) {options.cwd = cwd; return *this;}
302 RunBuilder& env(const EnvMap& env) {options.env = env; return *this;}
304 RunBuilder& timeout(double timeout) {options.timeout = timeout; return *this;}
311 RunBuilder& new_process_group(bool new_group) {options.new_process_group = new_group; return *this;}
312 operator RunOptions() const {return options;}
313
324 };
325
334 double sleep_seconds(double seconds);
335
336 class StopWatch {
337 public:
339
340 void start() { mStart = monotonic_seconds(); }
341 double seconds() const { return monotonic_seconds() - mStart; }
342 private:
343 double mStart;
344 };
345}
Definition ProcessBuilder.hpp:219
Popen run()
Definition ProcessBuilder.hpp:242
Popen run_command(const CommandLine &command)
EnvMap env
Definition ProcessBuilder.hpp:234
PipeOption cout_option
Definition ProcessBuilder.hpp:229
std::string windows_args(const CommandLine &command)
std::string windows_command()
PipeOption cerr_option
Definition ProcessBuilder.hpp:230
PipeHandle cout_pipe
Definition ProcessBuilder.hpp:224
std::string cwd
Definition ProcessBuilder.hpp:235
CommandLine command
Definition ProcessBuilder.hpp:236
PipeHandle cin_pipe
Definition ProcessBuilder.hpp:223
PipeOption cin_option
Definition ProcessBuilder.hpp:228
bool new_process_group
Definition ProcessBuilder.hpp:232
std::vector< PipeHandle > child_close_pipes
Definition ProcessBuilder.hpp:221
PipeHandle cerr_pipe
Definition ProcessBuilder.hpp:225
Definition ProcessBuilder.hpp:336
double seconds() const
Definition ProcessBuilder.hpp:341
void start()
Definition ProcessBuilder.hpp:340
StopWatch()
Definition ProcessBuilder.hpp:338
Definition basic_types.hpp:22
double monotonic_seconds()
bool pipe_close(PipeHandle handle)
int PipeHandle
Definition basic_types.hpp:77
PipeOption
Definition basic_types.hpp:103
@ cout
Redirects to stdout.
@ inherit
Inherits current process handle.
@ cerr
redirects to stderr
const PipeHandle kBadPipeValue
Definition basic_types.hpp:84
::pid_t pid_t
Definition basic_types.hpp:78
CompletedProcess run(Popen &popen, bool check=false)
std::vector< std::string > CommandLine
Definition basic_types.hpp:99
double sleep_seconds(double seconds)
void pipe_ignore_and_close(PipeHandle handle)
std::map< std::string, std::string > EnvMap
Definition basic_types.hpp:100
constexpr int kBadReturnCode
Definition basic_types.hpp:97
std::variant< PipeOption, std::string, PipeHandle, std::istream *, std::ostream *, FILE * > PipeVar
Definition PipeVar.hpp:22
Definition basic_types.hpp:164
Definition ProcessBuilder.hpp:91
int returncode
Definition ProcessBuilder.hpp:138
CommandLine args
Definition ProcessBuilder.hpp:140
void close_cin()
Definition ProcessBuilder.hpp:191
PipeHandle cin
Definition ProcessBuilder.hpp:115
Popen & operator=(const Popen &)=delete
void ignore_output()
Definition ProcessBuilder.hpp:147
Popen(CommandLine command, RunOptions &&options)
int wait(double timeout=-1)
PipeHandle cout
Definition ProcessBuilder.hpp:124
Popen()
Definition ProcessBuilder.hpp:94
bool send_signal(int signal)
void ignore_cout()
Definition ProcessBuilder.hpp:143
Popen(CommandLine command, const RunOptions &options)
PipeHandle cerr
Definition ProcessBuilder.hpp:133
Popen & operator=(Popen &&)
std::string cwd
Definition ProcessBuilder.hpp:139
friend ProcessBuilder
Definition ProcessBuilder.hpp:197
pid_t pid
Definition ProcessBuilder.hpp:136
void ignore_cerr()
Definition ProcessBuilder.hpp:145
Popen(const Popen &)=delete
Definition ProcessBuilder.hpp:282
RunBuilder()
Definition ProcessBuilder.hpp:286
RunBuilder & cin(const PipeVar &cin)
Definition ProcessBuilder.hpp:294
Popen popen()
Definition ProcessBuilder.hpp:323
RunBuilder & timeout(double timeout)
Definition ProcessBuilder.hpp:304
RunBuilder(std::initializer_list< std::string > command)
Definition ProcessBuilder.hpp:290
RunBuilder & new_process_group(bool new_group)
Definition ProcessBuilder.hpp:311
CommandLine command
Definition ProcessBuilder.hpp:284
RunOptions options
Definition ProcessBuilder.hpp:283
RunBuilder & cwd(std::string cwd)
Definition ProcessBuilder.hpp:300
RunBuilder & env(const EnvMap &env)
Definition ProcessBuilder.hpp:302
RunBuilder & cout(const PipeVar &cout)
Definition ProcessBuilder.hpp:296
CompletedProcess run()
Definition ProcessBuilder.hpp:318
RunBuilder(CommandLine cmd)
Definition ProcessBuilder.hpp:288
RunBuilder & cerr(const PipeVar &cerr)
Definition ProcessBuilder.hpp:298
RunBuilder & check(bool ch)
Definition ProcessBuilder.hpp:292
Definition ProcessBuilder.hpp:25
bool check
Definition ProcessBuilder.hpp:80
std::string cwd
Definition ProcessBuilder.hpp:69
PipeVar cout
Definition ProcessBuilder.hpp:43
bool new_process_group
Definition ProcessBuilder.hpp:66
double timeout
Definition ProcessBuilder.hpp:76
PipeVar cerr
Definition ProcessBuilder.hpp:63
EnvMap env
Definition ProcessBuilder.hpp:82
PipeVar cin
Definition ProcessBuilder.hpp:34