如何使用 Boost.Process 从“类型”(Windows)获取跟踪?

Posted

技术标签:

【中文标题】如何使用 Boost.Process 从“类型”(Windows)获取跟踪?【英文标题】:How to get trace from 'type' (windows) using Boost.Process? 【发布时间】:2012-10-01 18:51:05 【问题描述】:

我想使用 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();
 

而且我最近看到 anethig 从中出来。就像它根本无法抓取type 流=(而我对echoping 的所有其他测试都像魅力一样工作) 有什么方法可以让 Boost.Process 正确地与type 命令行应用程序一起工作?

【问题讨论】:

【参考方案1】:

我记得在 win32 上传递给子进程的第一个参数应该是 exe 名称。我也相信操作系统会吃掉第一个参数,期望它是 exe 名称,然后将其余的传递给您的应用程序。

看到这个:Paths and CreateProcess

还有这个:http://msdn.microsoft.com/en-us/library/ms682425.aspx

【讨论】:

以上是关于如何使用 Boost.Process 从“类型”(Windows)获取跟踪?的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Process - 如何让一个进程运行一个函数?

使用 boost::process 读取 cout 并写入进程的 cin

带有标准输出重定向的`boost :: process`在Ubuntu 16中随机失败

Boost::process child by id

Windows 上的 Boost::process - 使用 MinGW?

使用 boost 过程编译一个简单的应用程序会产生错误