subprocess  0.1.0
Modern subprocess library for c++
ProcessBuilder.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <initializer_list>
4 #include <vector>
5 #include <string>
6 
7 #include "pipe.hpp"
8 #include "PipeVar.hpp"
9 
10 namespace subprocess {
11 
12  /* For reference:
13  0 - cin
14  1 - cout
15  2 - cerr
16  */
17  /* possible names:
18  PopenOptions,
19  RunDef,
20  RunConfig
21  RunOptions
22  */
23 
24  struct RunOptions {
28  bool check = false;
47 
49  std::string cwd;
52 
57  double timeout = -1;
58  };
59  class ProcessBuilder;
64  struct Popen {
65  public:
67  Popen(){}
69  Popen(CommandLine command, const RunOptions& options);
71  Popen(CommandLine command, RunOptions&& options);
72  Popen(const Popen&)=delete;
73  Popen& operator=(const Popen&)=delete;
74 
75  Popen(Popen&&);
76  Popen& operator=(Popen&&);
77 
79  ~Popen();
80 
93 
94 
95  pid_t pid = 0;
99 
110  bool poll();
126  int wait(double timeout=-1);
131  bool send_signal(int signal);
133  bool terminate();
135  bool kill();
136 
138  void close();
140  void close_cin() {
141  if (cin != kBadPipeValue) {
142  pipe_close(cin);
143  cin = kBadPipeValue;
144  }
145  }
147  private:
148  void init(CommandLine& command, RunOptions& options);
149 
150 #ifdef _WIN32
151  PROCESS_INFORMATION process_info;
152 #endif
153  };
154 
155 
156 
163  public:
164  std::vector<PipeHandle> child_close_pipes;
165 
169 
170 
174 
177  std::string cwd;
179 
180  std::string windows_command();
181  std::string windows_args();
182  std::string windows_args(const CommandLine& command);
183 
184  Popen run() {
185  return run_command(this->command);
186  }
188  };
189 
208  CompletedProcess run(Popen& popen, bool check=false);
218  CompletedProcess run(CommandLine command, RunOptions options={});
219 
221  struct RunBuilder {
224 
229  RunBuilder(std::initializer_list<std::string> command) : command(command){}
231  RunBuilder& check(bool ch) {options.check = ch; return *this;}
233  RunBuilder& cin(const PipeVar& cin) {options.cin = cin; return *this;}
235  RunBuilder& cout(const PipeVar& cout) {options.cout = cout; return *this;}
237  RunBuilder& cerr(const PipeVar& cerr) {options.cerr = cerr; return *this;}
239  RunBuilder& cwd(std::string cwd) {options.cwd = cwd; return *this;}
241  RunBuilder& env(const EnvMap& env) {options.env = env; return *this;}
243  RunBuilder& timeout(double timeout) {options.timeout = timeout; return *this;}
244 
245  operator RunOptions() const {return options;}
246 
256  Popen popen() { return Popen(command, options); }
257  };
258 
260  double monotonic_seconds();
267  double sleep_seconds(double seconds);
268 
269  class StopWatch {
270  public:
271  StopWatch() { start(); }
272 
273  void start() { mStart = monotonic_seconds(); }
274  double seconds() const { return monotonic_seconds() - mStart; }
275  private:
276  double mStart;
277  };
278 }
subprocess::RunBuilder::options
RunOptions options
Definition: ProcessBuilder.hpp:222
subprocess::Popen::send_signal
bool send_signal(int signal)
subprocess::RunBuilder::command
CommandLine command
Definition: ProcessBuilder.hpp:223
subprocess::RunBuilder::check
RunBuilder & check(bool ch)
Definition: ProcessBuilder.hpp:231
subprocess::ProcessBuilder::windows_args
std::string windows_args()
subprocess::monotonic_seconds
double monotonic_seconds()
subprocess::kBadPipeValue
const PipeHandle kBadPipeValue
Definition: basic_types.hpp:68
subprocess::Popen::kill
bool kill()
subprocess::RunBuilder::cout
RunBuilder & cout(const PipeVar &cout)
Definition: ProcessBuilder.hpp:235
subprocess::run
CompletedProcess run(Popen &popen, bool check=false)
subprocess::ProcessBuilder::cerr_option
PipeOption cerr_option
Definition: ProcessBuilder.hpp:173
subprocess::Popen::Popen
Popen()
Definition: ProcessBuilder.hpp:67
subprocess::Popen::close_cin
void close_cin()
Definition: ProcessBuilder.hpp:140
subprocess::Popen::returncode
int returncode
Definition: ProcessBuilder.hpp:97
subprocess::ProcessBuilder::cout_option
PipeOption cout_option
Definition: ProcessBuilder.hpp:172
subprocess::RunOptions::cin
PipeVar cin
Definition: ProcessBuilder.hpp:34
subprocess::ProcessBuilder::run
Popen run()
Definition: ProcessBuilder.hpp:184
subprocess::pipe_ignore_and_close
void pipe_ignore_and_close(PipeHandle handle)
subprocess::kBadReturnCode
constexpr int kBadReturnCode
Definition: basic_types.hpp:81
PipeVar.hpp
subprocess::RunOptions::cerr
PipeVar cerr
Definition: ProcessBuilder.hpp:46
subprocess::Popen::args
CommandLine args
Definition: ProcessBuilder.hpp:98
subprocess::RunBuilder::cerr
RunBuilder & cerr(const PipeVar &cerr)
Definition: ProcessBuilder.hpp:237
subprocess::Popen::cout
PipeHandle cout
Definition: ProcessBuilder.hpp:88
subprocess::StopWatch
Definition: ProcessBuilder.hpp:269
subprocess::RunBuilder
Definition: ProcessBuilder.hpp:221
subprocess::RunBuilder::cwd
RunBuilder & cwd(std::string cwd)
Definition: ProcessBuilder.hpp:239
subprocess::ProcessBuilder::child_close_pipes
std::vector< PipeHandle > child_close_pipes
Definition: ProcessBuilder.hpp:164
subprocess::Popen::cerr
PipeHandle cerr
Definition: ProcessBuilder.hpp:92
subprocess::ProcessBuilder::run_command
Popen run_command(const CommandLine &command)
subprocess::PipeOption
PipeOption
Definition: basic_types.hpp:87
subprocess::PipeHandle
int PipeHandle
Definition: basic_types.hpp:61
subprocess::Popen::ignore_output
void ignore_output()
Definition: ProcessBuilder.hpp:105
subprocess::Popen::pid
pid_t pid
Definition: ProcessBuilder.hpp:95
subprocess::Popen::close
void close()
subprocess::StopWatch::start
void start()
Definition: ProcessBuilder.hpp:273
subprocess::sleep_seconds
double sleep_seconds(double seconds)
subprocess::Popen::~Popen
~Popen()
subprocess::Popen
Definition: ProcessBuilder.hpp:64
subprocess::ProcessBuilder::cerr_pipe
PipeHandle cerr_pipe
Definition: ProcessBuilder.hpp:168
subprocess::Popen::wait
int wait(double timeout=-1)
subprocess::StopWatch::StopWatch
StopWatch()
Definition: ProcessBuilder.hpp:271
subprocess::pid_t
::pid_t pid_t
Definition: basic_types.hpp:62
subprocess::ProcessBuilder::command
CommandLine command
Definition: ProcessBuilder.hpp:178
subprocess::RunOptions::cwd
std::string cwd
Definition: ProcessBuilder.hpp:49
subprocess::Popen::ignore_cout
void ignore_cout()
Definition: ProcessBuilder.hpp:101
subprocess::RunBuilder::env
RunBuilder & env(const EnvMap &env)
Definition: ProcessBuilder.hpp:241
subprocess::RunOptions::timeout
double timeout
Definition: ProcessBuilder.hpp:57
subprocess::RunOptions
Definition: ProcessBuilder.hpp:24
subprocess::ProcessBuilder::windows_command
std::string windows_command()
subprocess::Popen::operator=
Popen & operator=(const Popen &)=delete
pipe.hpp
subprocess::RunOptions::cout
PipeVar cout
Definition: ProcessBuilder.hpp:40
subprocess::ProcessBuilder::env
EnvMap env
Definition: ProcessBuilder.hpp:176
subprocess::EnvMap
std::map< std::string, std::string > EnvMap
Definition: basic_types.hpp:84
subprocess::Popen::poll
bool poll()
subprocess::ProcessBuilder::cin_option
PipeOption cin_option
Definition: ProcessBuilder.hpp:171
subprocess::StopWatch::seconds
double seconds() const
Definition: ProcessBuilder.hpp:274
subprocess::PipeVar
std::variant< PipeOption, std::string, PipeHandle, std::istream *, std::ostream *, FILE * > PipeVar
Definition: PipeVar.hpp:22
subprocess::CompletedProcess
Definition: basic_types.hpp:148
subprocess::pipe_close
bool pipe_close(PipeHandle handle)
subprocess::ProcessBuilder::cin_pipe
PipeHandle cin_pipe
Definition: ProcessBuilder.hpp:166
subprocess::Popen::terminate
bool terminate()
subprocess::Popen::ignore_cerr
void ignore_cerr()
Definition: ProcessBuilder.hpp:103
subprocess
Definition: basic_types.hpp:19
subprocess::RunBuilder::popen
Popen popen()
Definition: ProcessBuilder.hpp:256
subprocess::CommandLine
std::vector< std::string > CommandLine
Definition: basic_types.hpp:83
subprocess::Popen::cin
PipeHandle cin
Definition: ProcessBuilder.hpp:84
subprocess::ProcessBuilder::cout_pipe
PipeHandle cout_pipe
Definition: ProcessBuilder.hpp:167
subprocess::RunBuilder::RunBuilder
RunBuilder()
Definition: ProcessBuilder.hpp:225
subprocess::Popen::ProcessBuilder
friend ProcessBuilder
Definition: ProcessBuilder.hpp:146
subprocess::PipeOption::inherit
@ inherit
Inherits current process handle.
subprocess::RunOptions::check
bool check
Definition: ProcessBuilder.hpp:28
subprocess::RunBuilder::RunBuilder
RunBuilder(std::initializer_list< std::string > command)
Definition: ProcessBuilder.hpp:229
subprocess::RunOptions::env
EnvMap env
Definition: ProcessBuilder.hpp:51
subprocess::ProcessBuilder::cwd
std::string cwd
Definition: ProcessBuilder.hpp:177
subprocess::RunBuilder::timeout
RunBuilder & timeout(double timeout)
Definition: ProcessBuilder.hpp:243
subprocess::RunBuilder::RunBuilder
RunBuilder(CommandLine cmd)
Definition: ProcessBuilder.hpp:227
subprocess::RunBuilder::run
CompletedProcess run()
Definition: ProcessBuilder.hpp:251
subprocess::RunBuilder::cin
RunBuilder & cin(const PipeVar &cin)
Definition: ProcessBuilder.hpp:233
subprocess::ProcessBuilder
Definition: ProcessBuilder.hpp:162