正在使用boost::process::async_system获取co-await



就像标题所说的,我想对用boost::process::async_system派生的进程进行co-await。

所以我正在做这样的事情:

Coliru上的示例

namespace bp = boost::process;
bp::async_pipe ap(io_);
// Create the child process object with our parameters and a redirected stdout
co_await bp::async_system(io_,
boost::asio::use_awaitable,
bp::search_path(command),
bp::start_dir(cwd),
bp::args(args),
bp::std_out > ap);

但我收到了一条毫无帮助的错误消息。

我现在的假设是,async_system与co-await不兼容。在boost::asio::awaitable中集成第三方异步机制还有其他(可能是通用的(方法吗?

(我在整个boost::asio/c++coro主题中感到有点迷失。谷歌没有太大帮助,boost-doc对我来说有点过于极简。(

我会为风格塑造一些代码:http://coliru.stacked-crooked.com/a/33667a7d106de0e7

真正的问题

现在有了以上内容,当您尝试取消对async_system调用的注释时,my_coro内部仍然存在错误。

我没有阅读消息,而是查看了代码,认为它应该有效,并查看了实现:

template<typename ExitHandler, typename ...Args>
inline BOOST_ASIO_INITFN_RESULT_TYPE(ExitHandler, void (boost::system::error_code, int))
async_system(boost::asio::io_context & ios, ExitHandler && exit_handler, Args && ...args)
{
detail::async_system_handler<ExitHandler> async_h{ios, std::forward<ExitHandler>(exit_handler)};
typedef typename ::boost::process::detail::has_error_handler<boost::fusion::tuple<Args...>>::type
has_err_handling;
static_assert(!has_err_handling::value, "async_system cannot have custom error handling");

child(ios, std::forward<Args>(args)..., async_h ).detach();
return async_h.get_result();
}

在查看了实现之后,我认为

/usr/local/include/boost/asio/async_result.hpp:651:9: error: no type named 'completion_handler_type' in 'class boost::asio::async_result<boost::asio::use_awaitable_t<>, void(boost::system::error_code, int)>'

表示Boost进程尚未更新以支持较新的async_result协议,该协议似乎使用initiate成员函数而不是completion_handler_type。这为async_result实现提供了更多的选项,use_awaitable_t令牌可能需要这些选项。

我会在图书馆提出一个问题。

请注意,当前的develop分支正在执行的代码似乎确实正确地支持use_awaitable(e.v.boost/process/v2/popen.hpp(

最新更新