我想使用Boost.Process(docs I used source I used)创建一些服务,但在测试lib时发现我甚至无法追踪像type
这样的简单cmd应用程序(注意:在同一个文件夹中,我从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();
}
我更新看到他们从中脱颖而出。就像它无法抓取type
流一样=((而我所有的其他测试都说echo
和ping
就像魅力一样)
有没有办法让Boost.Process正确地使用type
命令行应用程序?
答案 0 :(得分:0)
从我在win32上回忆一下,传递给子进程的第一个arg应该是exe名称。我也相信操作系统会首先使用它作为exe名称的第一个参数,然后将其余参数传递给你的应用程序。