libwreport  3.23
subprocess.h
1 #ifndef WREPORT_SUBPROCESS_H
2 #define WREPORT_SUBPROCESS_H
3 
4 #include <vector>
5 #include <string>
6 #include <sys/types.h>
7 
8 namespace wreport {
9 namespace subprocess {
10 
11 enum class Redirect
12 {
16  PIPE,
17 
19  DEVNULL,
20 
22  STDOUT,
23 
25  FD,
26 
28  UNCHANGED,
29 };
30 
31 
32 class Child
33 {
34 protected:
35  pid_t m_pid = 0;
36  int m_returncode = 0;
37  bool m_terminated = false;
38  int m_stdin[2] = { -1, -1 };
39  int m_stdout[2] = { -1, -1 };
40  int m_stderr[2] = { -1, -1 };
41  Redirect m_stdin_action = Redirect::UNCHANGED;
42  Redirect m_stdout_action = Redirect::UNCHANGED;
43  Redirect m_stderr_action = Redirect::UNCHANGED;
44 
46  virtual void pre_fork();
47 
49  virtual void post_fork_parent();
50 
52  virtual void post_fork_child();
53 
59  virtual int main() noexcept = 0;
60 
61 public:
63  bool close_fds = true;
64 
69  std::vector<int> pass_fds;
70 
72  std::string cwd;
73 
75  bool start_new_session = false;
76 
78  int get_stdin() const;
80  int get_stdout() const;
82  int get_stderr() const;
83 
85  void set_stdin(int fd);
87  void set_stdin(Redirect val);
89  void set_stdout(int fd);
91  void set_stdout(Redirect val);
93  void set_stderr(int fd);
95  void set_stderr(Redirect val);
96 
98  void close_stdin();
100  void close_stdout();
102  void close_stderr();
103 
104  Child() = default;
105  Child(const Child&) = delete;
106  Child(Child&&) = delete;
107  virtual ~Child();
108 
109  Child& operator=(const Child&) = delete;
110  Child& operator=(Child&&) = delete;
111 
113  void fork();
114 
116  pid_t pid() const { return m_pid; }
117 
122  int returncode() const;
123 
125  int raw_returncode() const { return m_returncode; }
126 
128  bool started() const { return m_pid != 0; }
129 
131  bool terminated() const { return m_terminated; }
132 
134  bool poll();
135 
137  int wait();
138 
140  void send_signal(int sig);
141 
143  void terminate();
144 
146  void kill();
147 
149  static std::string format_raw_returncode(int raw_returncode);
150 };
151 
152 
153 class Popen : public Child
154 {
155 protected:
156  int main() noexcept override;
157 
158 public:
160  std::vector<std::string> args;
162  std::string executable;
164  std::vector<std::string> env;
165 
166  using Child::Child;
167 
168  Popen() = default;
169  Popen(std::initializer_list<std::string> args);
170 
172  void copy_env_from_parent();
173 
174  void setenv(const std::string& key, const std::string& val);
175 };
176 
177 
178 }
179 }
180 
181 #endif
std::string executable
pathname to the executable of the child process, defaults to args[0] if empty
Definition: subprocess.h:162
Definition: subprocess.h:153
int raw_returncode() const
Return the raw return code as returned by wait(2)
Definition: subprocess.h:125
std::vector< std::string > args
argv of the child process
Definition: subprocess.h:160
std::string cwd
Change to this directory in the child process.
Definition: subprocess.h:72
bool terminated() const
Return true if the process has terminated.
Definition: subprocess.h:131
pid_t pid() const
Return the PID of the subprocess, or 0 if it has not started yet.
Definition: subprocess.h:116
bool started() const
Return true if the process has started.
Definition: subprocess.h:128
String functions.
Definition: benchmark.h:13
std::vector< std::string > env
environment variables to use for the child process
Definition: subprocess.h:164
Definition: subprocess.h:32
std::vector< int > pass_fds
Do not close these file descriptors in the child process (implies close_fds = true) ...
Definition: subprocess.h:69