Boost 1.71.0:如何获取进程输出?
Boost 1.71.0: How to get process output?
我有这样的代码,在 Ubuntu 18.04
和 Boost 1.65.0
:
上运行良好
// See https://www.boost.org/doc/libs/1_65_0/doc/html/boost_process/tutorial.html
std::pair<int, std::string> runCommandAndGetOutput(const std::string & cmd, const std::vector<std::string> & args)
{
namespace bp = boost::process;
boost::asio::io_service ios;
std::future<std::string> data;
bp::child c(cmd, bp::args(args), bp::std_in.close(), bp::std_out > data, bp::std_err > bp::null, ios);
ios.run();
if (c.exit_code()) {
std::cerr << "Command '" << cmd << "' failed with return value: " << c.exit_code();
}
return { c.exit_code(), data.get() };
}
但是,在升级到 Ubuntu 20.04
和 Boost 1.71.0
之后,它不再编译,因为似乎 boost::asio::io_service
已被弃用并且不再存在。
谷歌搜索后我意识到我必须改用 boost::asio::io_context
。
好的:
std::pair<int, std::string> runCommandAndGetOutput(const std::string & cmd, const std::vector<std::string> & args)
{
namespace bp = boost::process;
boost::asio::io_context ioc;
std::future<std::string> data;
bp::child c(cmd, bp::args(args), bp::std_in.close(), bp::std_out > data, bp::std_err > bp::null, ioc);
ioc.run();
if (c.exit_code()) {
std::cerr << "Command '" << cmd << "' failed with return value: " << c.exit_code();
}
return { c.exit_code(), data.get() };
}
这可以编译,但无法正常工作。尝试 运行 例如/usr/bin/free
returns 退出代码 383
没有任何意义。
困难在于 Boost 1.71.0
的文档仍在使用 io_service
:
https://www.boost.org/doc/libs/1_71_0/doc/html/boost_process/tutorial.html
有谁知道应该怎么做才对?
您需要 wait
直到 child 完成。
exit_code
- “获取 exit_code。如果没有等待 child 或者如果 return 值没有任何意义它被终止了。"
#include "boost/process.hpp"
#include <iostream>
std::pair<int, std::string> runCommandAndGetOutput(
const std::string& cmd, const std::vector<std::string>& args) {
namespace bp = boost::process;
boost::asio::io_context ioc;
std::future<std::string> data;
bp::child c(cmd, bp::args(args), bp::std_in.close(), bp::std_out > data,
bp::std_err > bp::null, ioc);
ioc.run();
c.wait(); // <---- here
if(c.exit_code()) {
std::cerr << "Command '" << cmd
<< "' failed with return value: " << c.exit_code();
}
return {c.exit_code(), data.get()};
}
int main() {
auto rv = runCommandAndGetOutput("/usr/bin/free", {});
std::cout << "\n----------\n" << rv.second << '\n' << rv.first << '\n';
}
我有这样的代码,在 Ubuntu 18.04
和 Boost 1.65.0
:
// See https://www.boost.org/doc/libs/1_65_0/doc/html/boost_process/tutorial.html
std::pair<int, std::string> runCommandAndGetOutput(const std::string & cmd, const std::vector<std::string> & args)
{
namespace bp = boost::process;
boost::asio::io_service ios;
std::future<std::string> data;
bp::child c(cmd, bp::args(args), bp::std_in.close(), bp::std_out > data, bp::std_err > bp::null, ios);
ios.run();
if (c.exit_code()) {
std::cerr << "Command '" << cmd << "' failed with return value: " << c.exit_code();
}
return { c.exit_code(), data.get() };
}
但是,在升级到 Ubuntu 20.04
和 Boost 1.71.0
之后,它不再编译,因为似乎 boost::asio::io_service
已被弃用并且不再存在。
谷歌搜索后我意识到我必须改用 boost::asio::io_context
。
好的:
std::pair<int, std::string> runCommandAndGetOutput(const std::string & cmd, const std::vector<std::string> & args)
{
namespace bp = boost::process;
boost::asio::io_context ioc;
std::future<std::string> data;
bp::child c(cmd, bp::args(args), bp::std_in.close(), bp::std_out > data, bp::std_err > bp::null, ioc);
ioc.run();
if (c.exit_code()) {
std::cerr << "Command '" << cmd << "' failed with return value: " << c.exit_code();
}
return { c.exit_code(), data.get() };
}
这可以编译,但无法正常工作。尝试 运行 例如/usr/bin/free
returns 退出代码 383
没有任何意义。
困难在于 Boost 1.71.0
的文档仍在使用 io_service
:
https://www.boost.org/doc/libs/1_71_0/doc/html/boost_process/tutorial.html
有谁知道应该怎么做才对?
您需要 wait
直到 child 完成。
exit_code
- “获取 exit_code。如果没有等待 child 或者如果 return 值没有任何意义它被终止了。"
#include "boost/process.hpp"
#include <iostream>
std::pair<int, std::string> runCommandAndGetOutput(
const std::string& cmd, const std::vector<std::string>& args) {
namespace bp = boost::process;
boost::asio::io_context ioc;
std::future<std::string> data;
bp::child c(cmd, bp::args(args), bp::std_in.close(), bp::std_out > data,
bp::std_err > bp::null, ioc);
ioc.run();
c.wait(); // <---- here
if(c.exit_code()) {
std::cerr << "Command '" << cmd
<< "' failed with return value: " << c.exit_code();
}
return {c.exit_code(), data.get()};
}
int main() {
auto rv = runCommandAndGetOutput("/usr/bin/free", {});
std::cout << "\n----------\n" << rv.second << '\n' << rv.first << '\n';
}