subprocess  0.4.0
Modern subprocess library for c++
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
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  bool new_process_group = false;
50 
52  std::string cwd;
55 
60  double timeout = -1;
61  };
62  class ProcessBuilder;
67  struct Popen {
68  public:
70  Popen(){}
72  Popen(CommandLine command, const RunOptions& options);
74  Popen(CommandLine command, RunOptions&& options);
75  Popen(const Popen&)=delete;
76  Popen& operator=(const Popen&)=delete;
77 
78  Popen(Popen&&);
79  Popen& operator=(Popen&&);
80 
82  ~Popen();
83 
96 
97 
98  pid_t pid = 0;
102 
113  bool poll();
129  int wait(double timeout=-1);
143  bool send_signal(int signal);
145  bool terminate();
147  bool kill();
148 
150  void close();
152  void close_cin() {
153  if (cin != kBadPipeValue) {
154  pipe_close(cin);
155  cin = kBadPipeValue;
156  }
157  }
159  private:
160  void init(CommandLine& command, RunOptions& options);
161 
162 #ifdef _WIN32
163  PROCESS_INFORMATION process_info;
164 #endif
165  };
166 
167 
168 
175  public:
176  std::vector<PipeHandle> child_close_pipes;
177 
181 
182 
186 
187  bool new_process_group = false;
190  std::string cwd;
192 
193  std::string windows_command();
194  std::string windows_args();
195  std::string windows_args(const CommandLine& command);
196 
197  Popen run() {
198  return run_command(this->command);
199  }
201  };
202 
224  CompletedProcess run(Popen& popen, bool check=false);
234  CompletedProcess run(CommandLine command, RunOptions options={});
235 
237  struct RunBuilder {
240 
245  RunBuilder(std::initializer_list<std::string> command) : command(command){}
247  RunBuilder& check(bool ch) {options.check = ch; return *this;}
249  RunBuilder& cin(const PipeVar& cin) {options.cin = cin; return *this;}
251  RunBuilder& cout(const PipeVar& cout) {options.cout = cout; return *this;}
253  RunBuilder& cerr(const PipeVar& cerr) {options.cerr = cerr; return *this;}
255  RunBuilder& cwd(std::string cwd) {options.cwd = cwd; return *this;}
257  RunBuilder& env(const EnvMap& env) {options.env = env; return *this;}
259  RunBuilder& timeout(double timeout) {options.timeout = timeout; return *this;}
266  RunBuilder& new_process_group(bool new_group) {options.new_process_group = new_group; return *this;}
267  operator RunOptions() const {return options;}
268 
278  Popen popen() { return Popen(command, options); }
279  };
280 
282  double monotonic_seconds();
289  double sleep_seconds(double seconds);
290 
291  class StopWatch {
292  public:
293  StopWatch() { start(); }
294 
295  void start() { mStart = monotonic_seconds(); }
296  double seconds() const { return monotonic_seconds() - mStart; }
297  private:
298  double mStart;
299  };
300 }
subprocess::RunBuilder::options
RunOptions options
Definition: ProcessBuilder.hpp:238
subprocess::Popen::send_signal
bool send_signal(int signal)
subprocess::RunBuilder::command
CommandLine command
Definition: ProcessBuilder.hpp:239
subprocess::RunBuilder::check
RunBuilder & check(bool ch)
Definition: ProcessBuilder.hpp:247
subprocess::ProcessBuilder::windows_args
std::string windows_args()
subprocess::monotonic_seconds
double monotonic_seconds()
subprocess::kBadPipeValue
const PipeHandle kBadPipeValue
Definition: basic_types.hpp:81
subprocess::Popen::kill
bool kill()
subprocess::RunBuilder::cout
RunBuilder & cout(const PipeVar &cout)
Definition: ProcessBuilder.hpp:251
subprocess::run
CompletedProcess run(Popen &popen, bool check=false)
subprocess::ProcessBuilder::cerr_option
PipeOption cerr_option
Definition: ProcessBuilder.hpp:185
subprocess::Popen::Popen
Popen()
Definition: ProcessBuilder.hpp:70
subprocess::Popen::close_cin
void close_cin()
Definition: ProcessBuilder.hpp:152
subprocess::Popen::returncode
int returncode
Definition: ProcessBuilder.hpp:100
subprocess::ProcessBuilder::cout_option
PipeOption cout_option
Definition: ProcessBuilder.hpp:184
subprocess::RunOptions::cin
PipeVar cin
Definition: ProcessBuilder.hpp:34
subprocess::ProcessBuilder::run
Popen run()
Definition: ProcessBuilder.hpp:197
subprocess::pipe_ignore_and_close
void pipe_ignore_and_close(PipeHandle handle)
subprocess::kBadReturnCode
constexpr int kBadReturnCode
Definition: basic_types.hpp:94
PipeVar.hpp
subprocess::RunOptions::cerr
PipeVar cerr
Definition: ProcessBuilder.hpp:46
subprocess::Popen::args
CommandLine args
Definition: ProcessBuilder.hpp:101
subprocess::RunBuilder::cerr
RunBuilder & cerr(const PipeVar &cerr)
Definition: ProcessBuilder.hpp:253
subprocess::Popen::cout
PipeHandle cout
Definition: ProcessBuilder.hpp:91
subprocess::StopWatch
Definition: ProcessBuilder.hpp:291
subprocess::RunBuilder
Definition: ProcessBuilder.hpp:237
subprocess::RunBuilder::cwd
RunBuilder & cwd(std::string cwd)
Definition: ProcessBuilder.hpp:255
subprocess::ProcessBuilder::child_close_pipes
std::vector< PipeHandle > child_close_pipes
Definition: ProcessBuilder.hpp:176
subprocess::Popen::cerr
PipeHandle cerr
Definition: ProcessBuilder.hpp:95
subprocess::ProcessBuilder::run_command
Popen run_command(const CommandLine &command)
subprocess::PipeOption
PipeOption
Definition: basic_types.hpp:100
subprocess::PipeHandle
int PipeHandle
Definition: basic_types.hpp:74
subprocess::RunBuilder::new_process_group
RunBuilder & new_process_group(bool new_group)
Definition: ProcessBuilder.hpp:266
subprocess::Popen::ignore_output
void ignore_output()
Definition: ProcessBuilder.hpp:108
subprocess::Popen::pid
pid_t pid
Definition: ProcessBuilder.hpp:98
subprocess::Popen::close
void close()
subprocess::StopWatch::start
void start()
Definition: ProcessBuilder.hpp:295
subprocess::sleep_seconds
double sleep_seconds(double seconds)
subprocess::Popen::~Popen
~Popen()
subprocess::Popen
Definition: ProcessBuilder.hpp:67
subprocess::ProcessBuilder::cerr_pipe
PipeHandle cerr_pipe
Definition: ProcessBuilder.hpp:180
subprocess::Popen::wait
int wait(double timeout=-1)
subprocess::StopWatch::StopWatch
StopWatch()
Definition: ProcessBuilder.hpp:293
subprocess::pid_t
::pid_t pid_t
Definition: basic_types.hpp:75
subprocess::ProcessBuilder::command
CommandLine command
Definition: ProcessBuilder.hpp:191
subprocess::RunOptions::cwd
std::string cwd
Definition: ProcessBuilder.hpp:52
subprocess::Popen::ignore_cout
void ignore_cout()
Definition: ProcessBuilder.hpp:104
subprocess::RunBuilder::env
RunBuilder & env(const EnvMap &env)
Definition: ProcessBuilder.hpp:257
subprocess::RunOptions::timeout
double timeout
Definition: ProcessBuilder.hpp:60
subprocess::RunOptions::new_process_group
bool new_process_group
Definition: ProcessBuilder.hpp:49
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:189
subprocess::EnvMap
std::map< std::string, std::string > EnvMap
Definition: basic_types.hpp:97
subprocess::Popen::poll
bool poll()
subprocess::ProcessBuilder::cin_option
PipeOption cin_option
Definition: ProcessBuilder.hpp:183
subprocess::StopWatch::seconds
double seconds() const
Definition: ProcessBuilder.hpp:296
subprocess::PipeVar
std::variant< PipeOption, std::string, PipeHandle, std::istream *, std::ostream *, FILE * > PipeVar
Definition: PipeVar.hpp:22
subprocess::CompletedProcess
Definition: basic_types.hpp:161
subprocess::pipe_close
bool pipe_close(PipeHandle handle)
subprocess::ProcessBuilder::cin_pipe
PipeHandle cin_pipe
Definition: ProcessBuilder.hpp:178
subprocess::Popen::terminate
bool terminate()
subprocess::Popen::ignore_cerr
void ignore_cerr()
Definition: ProcessBuilder.hpp:106
subprocess
Definition: basic_types.hpp:19
subprocess::RunBuilder::popen
Popen popen()
Definition: ProcessBuilder.hpp:278
subprocess::CommandLine
std::vector< std::string > CommandLine
Definition: basic_types.hpp:96
subprocess::Popen::cin
PipeHandle cin
Definition: ProcessBuilder.hpp:87
subprocess::ProcessBuilder::cout_pipe
PipeHandle cout_pipe
Definition: ProcessBuilder.hpp:179
subprocess::RunBuilder::RunBuilder
RunBuilder()
Definition: ProcessBuilder.hpp:241
subprocess::Popen::ProcessBuilder
friend ProcessBuilder
Definition: ProcessBuilder.hpp:158
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:245
subprocess::RunOptions::env
EnvMap env
Definition: ProcessBuilder.hpp:54
subprocess::ProcessBuilder::cwd
std::string cwd
Definition: ProcessBuilder.hpp:190
subprocess::RunBuilder::timeout
RunBuilder & timeout(double timeout)
Definition: ProcessBuilder.hpp:259
subprocess::RunBuilder::RunBuilder
RunBuilder(CommandLine cmd)
Definition: ProcessBuilder.hpp:243
subprocess::RunBuilder::run
CompletedProcess run()
Definition: ProcessBuilder.hpp:273
subprocess::RunBuilder::cin
RunBuilder & cin(const PipeVar &cin)
Definition: ProcessBuilder.hpp:249
subprocess::ProcessBuilder
Definition: ProcessBuilder.hpp:174
subprocess::ProcessBuilder::new_process_group
bool new_process_group
Definition: ProcessBuilder.hpp:187