libwreport  3.38
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 = std::vector<int>();
70 
72  std::string cwd = std::string();
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 
147  bool wait(int msecs);
148 
150  void send_signal(int sig);
151 
153  void terminate();
154 
156  void kill();
157 
159  static std::string format_raw_returncode(int raw_returncode);
160 };
161 
162 
163 class Popen : public Child
164 {
165 protected:
166  int main() noexcept override;
167 
168 public:
170  std::vector<std::string> args;
172  std::string executable;
174  std::vector<std::string> env;
175 
176  using Child::Child;
177 
178  Popen() = default;
179  Popen(std::initializer_list<std::string> args);
180 
182  void copy_env_from_parent();
183 
184  void setenv(const std::string& key, const std::string& val);
185 };
186 
187 
188 }
189 }
190 
191 #endif
int get_stdin() const
Return the file descriptor to the stdin pipe to the child process, if configured, else -1...
std::string executable
pathname to the executable of the child process, defaults to args[0] if empty
Definition: subprocess.h:172
Definition: subprocess.h:163
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:170
void close_stderr()
Close the pipe from the child process stderr.
std::string cwd
Change to this directory in the child process.
Definition: subprocess.h:72
int returncode() const
Return the return code of the subprocess; this is undefined if it has not terminated yet...
void close_stdin()
Close the pipe to the child process stdin.
void set_stderr(int fd)
Request to redirect the child stderr to this given file descriptor.
bool start_new_session
If true, call setsid() in the child process.
Definition: subprocess.h:75
bool terminated() const
Return true if the process has terminated.
Definition: subprocess.h:131
static std::string format_raw_returncode(int raw_returncode)
Format the status code returned by wait(2)
void fork()
Start the child process.
void send_signal(int sig)
Send the given signal to the process.
virtual void post_fork_child()
Function called after fork in the child process.
pid_t pid() const
Return the PID of the subprocess, or 0 if it has not started yet.
Definition: subprocess.h:116
int get_stdout() const
Return the file descriptor to the stdout pipe from the child process, if configured, else -1.
void kill()
Send SIGKILL to the process.
bool started() const
Return true if the process has started.
Definition: subprocess.h:128
bool poll()
Check if the process has terminated. Returns true if it has.
int wait()
Wait for the child process to terminate and return its return code.
bool close_fds
After fork, close all file descriptors >=2 in the child.
Definition: subprocess.h:63
virtual void pre_fork()
Function called before forking.
String functions.
Definition: benchmark.h:13
virtual int main() noexcept=0
Main function called in the child process.
void set_stdout(int fd)
Request to redirect the child stdout to this given file descriptor.
void copy_env_from_parent()
Override env with the contents of environment.
std::vector< std::string > env
environment variables to use for the child process
Definition: subprocess.h:174
Definition: subprocess.h:32
int get_stderr() const
Return the file descriptor to the stderr pipe from the child process, if configured, else -1.
std::vector< int > pass_fds
Do not close these file descriptors in the child process (implies close_fds = true) ...
Definition: subprocess.h:69
int main() noexcept override
Main function called in the child process.
void close_stdout()
Close the pipe from the child process stdout.
void set_stdin(int fd)
Request to redirect the child stdin to this given file descriptor.
virtual void post_fork_parent()
Function called after fork in the parent process.
void terminate()
Send SIGTERM to the process.