50 std::vector<std::string> args,
51 std::map<std::string, std::string> env = {},
52 uint32_t default_timeout_ms = 30000);
80 std::vector<std::string> args,
81 std::map<std::string, std::string> env,
82 uint32_t default_timeout_ms);
97 void close()
override;
107 const std::string& request_json,
108 uint32_t timeout_ms = 0)
override;
144 std::atomic<bool> cancel_flag_{
false};
146 std::string display_name_;
147 std::string command_;
148 std::vector<std::string> args_;
149 std::map<std::string, std::string> env_;
150 uint32_t default_timeout_ms_;
152 pid_t child_pid_{-1};
156 std::atomic<bool> connected_{
false};
157 std::thread stderr_thread_;
158 std::mutex io_mutex_;
166 std::vector<std::string> build_env()
const;
178 bool spawn_child(
int stdin_r,
int stdout_w,
int stderr_w,
179 const std::vector<std::string>& env_strs);
189 static bool create_pipe(
int& read_fd,
int& write_fd);
199 std::string read_line(
int fd, uint32_t timeout_ms);
211 int poll_until_ready(
213 std::chrono::steady_clock::time_point deadline);
222 bool create_all_pipes(
int (&fds)[6]);
230 bool open_child_process();
237 void stderr_reader_loop();
244 void terminate_child();
252 static void close_fd(
int& fd);