如何使用Boost.Process从'type'(windows)中获取跟踪?

时间:2012-10-01 18:51:05

标签: c++ windows boost command-line process

我想使用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流一样=((而我所有的其他测试都说echoping就像魅力一样) 有没有办法让Boost.Process正确地使用type命令行应用程序?

1 个答案:

答案 0 :(得分:0)

从我在win32上回忆一下,传递给子进程的第一个arg应该是exe名称。我也相信操作系统会首先使用它作为exe名称的第一个参数,然后将其余参数传递给你的应用程序。

请参阅:Paths and CreateProcess

而且:http://msdn.microsoft.com/en-us/library/ms682425.aspx