# include # include # include # include namespace hpcstat { std::optional exec (std::filesystem::path program, std::vector args, std::optional stdin) { namespace bp = boost::process; bp::ipstream output; bp::opstream input; std::unique_ptr process; if (stdin) { process = std::make_unique (program.string(), bp::args(args), bp::std_out > output, bp::std_err > stderr, bp::std_in < input); input << *stdin; input.pipe().close(); } else process = std::make_unique (program.string(), bp::args(args), bp::std_out > output, bp::std_err > stderr, bp::std_in < bp::null); process->wait(); if (process->exit_code() != 0) return std::nullopt; std::stringstream ss; ss << output.rdbuf(); return ss.str(); } long now() { return std::chrono::duration_cast (std::chrono::system_clock::now().time_since_epoch()).count(); } }