Boost.Process(使用したソースを使用したドキュメント )を使用してサービスを作成したかったのですが、libをテストしているときに、次のような単純なcmdアプリをトレースすることさえできないことがわかりました(注:同じフォルダー内でアプリを完全に起動します) 。type
type "./config.xml"
私が試したこと:
同期してみました:
#include <boost/process.hpp>
#include <string>
#include <vector>
#include <iostream>
namespace bp = ::boost::process;
bp::child start_child()
{
std::string exec = "type \"./config.xml\"";
std::vector<std::string> args;
bp::context ctx;
ctx.stdout_behavior = bp::capture_stream();
return bp::launch_shell(exec, args, ctx);
}
int main()
{
bp::child c = start_child();
bp::pistream &is = c.get_stdout();
std::string line;
while (std::getline(is, line))
std::cout << line << std::endl;
std::cin.get();
}
また非同期:
#if defined(__CYGWIN__)
# define _WIN32_WINNT 0x0501
# define __USE_W32_SOCKETS
# undef BOOST_POSIX_API
# define BOOST_WINDOWS_API
#endif
#include <boost/asio.hpp>
#define BOOST_PROCESS_WINDOWS_USE_NAMED_PIPE
#include <boost/process.hpp>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <string>
#include <vector>
#include <iostream>
namespace bp = ::boost::process;
namespace ba = ::boost::asio;
ba::io_service io_service;
boost::array<char, 4096> buffer;
#if defined(BOOST_POSIX_API)
ba::posix::stream_descriptor in(io_service);
#elif defined(BOOST_WINDOWS_API)
ba::windows::stream_handle in(io_service);
#else
# error "Unsupported platform."
#endif
bp::child start_child()
{
std::string exec = "type \"./config.xml\"";
bp::context ctx;
ctx.stdout_behavior = bp::capture_stream();
return bp::launch_shell(exec, ctx);
}
void end_read(const boost::system::error_code &ec, std::size_t bytes_transferred);
void begin_read()
{
in.async_read_some(boost::asio::buffer(buffer),
boost::bind(&end_read, ba::placeholders::error, ba::placeholders::bytes_transferred));
}
void end_read(const boost::system::error_code &ec, std::size_t bytes_transferred)
{
if (!ec)
{
std::cout << std::string(buffer.data(), bytes_transferred) << std::flush;
begin_read();
}
}
int main()
{
bp::child c = start_child();
bp::pistream &is = c.get_stdout();
in.assign(is.handle().release());
begin_read();
c.wait();
std::cin.get();
}
そして、私は新しいものがそこからanethigが出てくるのを見ます。Like Itはtype
ストリームをまったく取得できません=((他のすべてのテストは魅力のように機能echo
しping
ましたが)Boost.Processをtype
コマンドラインアプリケーションで正しく機能させる方法はありますか?