如何使用 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
流=(而我对echo
和ping
的所有其他测试都像魅力一样工作)
有什么方法可以让 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中随机失败