libwreport  3.36
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 
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 
183 
184  void setenv(const std::string& key, const std::string& val);
185 };
186 
187 
188 }
189 }
190 
191 #endif
Definition: subprocess.h:33
int get_stdout() const
Return the file descriptor to the stdout pipe from the child process, if configured,...
void close_stdout()
Close the pipe from the child process stdout.
void send_signal(int sig)
Send the given signal to the process.
virtual void pre_fork()
Function called before forking.
void set_stdin(int fd)
Request to redirect the child stdin to this given file descriptor.
void close_stderr()
Close the pipe from the child process stderr.
bool poll()
Check if the process has terminated. Returns true if it has.
std::vector< int > pass_fds
Do not close these file descriptors in the child process (implies close_fds = true)
Definition: subprocess.h:69
void set_stdout(int fd)
Request to redirect the child stdout to this given file descriptor.
std::string cwd
Change to this directory in the child process.
Definition: subprocess.h:72
bool start_new_session
If true, call setsid() in the child process.
Definition: subprocess.h:75
void kill()
Send SIGKILL to the process.
void close_stdin()
Close the pipe to the child process stdin.
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
bool terminated() const
Return true if the process has terminated.
Definition: subprocess.h:131
void fork()
Start the child process.
int get_stderr() const
Return the file descriptor to the stderr pipe from the child process, if configured,...
int wait()
Wait for the child process to terminate and return its return code.
virtual void post_fork_parent()
Function called after fork in the parent process.
static std::string format_raw_returncode(int raw_returncode)
Format the status code returned by wait(2)
int returncode() const
Return the return code of the subprocess; this is undefined if it has not terminated yet.
int raw_returncode() const
Return the raw return code as returned by wait(2)
Definition: subprocess.h:125
bool wait(int msecs)
Wait for the child process to terminate.
bool close_fds
After fork, close all file descriptors >=2 in the child.
Definition: subprocess.h:63
void terminate()
Send SIGTERM to the process.
virtual void post_fork_child()
Function called after fork in the child process.
int get_stdin() const
Return the file descriptor to the stdin pipe to the child process, if configured, else -1.
void set_stderr(int fd)
Request to redirect the child stderr to this given file descriptor.
virtual int main() noexcept=0
Main function called in the child process.
Definition: subprocess.h:164
std::string executable
pathname to the executable of the child process, defaults to args[0] if empty
Definition: subprocess.h:172
std::vector< std::string > args
argv of the child process
Definition: subprocess.h:170
std::vector< std::string > env
environment variables to use for the child process
Definition: subprocess.h:174
void copy_env_from_parent()
Override env with the contents of environment.
int main() noexcept override
Main function called in the child process.
String functions.
Definition: benchmark.h:13