2017-08-31 185 views
3

我正忙着用boost进程库。但由于种种原因,我不能设法送东西给标准输入:写入子进程的stdin

#include <iostream> 
#include <boost/process.hpp> 
using namespace boost::process; 

int main(int argc, char** argv) { 
    boost::asio::io_service ios; 

    std::future<std::string> outdata; 
    std::future<std::string> errdata; 

    child c("/usr/bin/cat", 
      std_out > outdata, 
      std_err > errdata, 
      std_in < "hi, there!", ios); 

    ios.run(); 
    std::cout << "stdout: " << outdata.get() << std::endl; 
    std::cerr << "stderr: " << errdata.get() << std::endl; 
} 

我预计这个工作本质上就像

echo "hi, there" | cat 

但是输出是空的。我错过了什么?

回答

1
std_in < "hi, there!" 

打开一个名为“hi,there!”的文件。并将其输入到子标准输入。

比较:Live On Coliru

#include <iostream> 
#include <boost/process.hpp> 
using namespace boost::process; 

int main() { 
    boost::asio::io_service ios; 

    std::future<std::string> outdata; 
    std::future<std::string> errdata; 

    child c("/bin/cat", 
      std_out > outdata, 
      std_err > errdata, 
      std_in < "main.cpp", ios); 

    ios.run(); 
    std::cout << "stdout: " << outdata.get() << std::endl; 
    std::cerr << "stderr: " << errdata.get() << std::endl; 
} 

打印自己的源代码。又见使用boost::process::buffer:(?)

Live On Coliru

你显然需要确保stdin关闭AFTE发送缓冲区

#include <iostream> 
#include <boost/process.hpp> 
#include <boost/process/async.hpp> 
using namespace boost::process; 

int main() { 
    boost::asio::io_service ios; 

    std::future<std::string> outdata; 
    std::future<std::string> errdata; 

    async_pipe in(ios); 
    child c("/bin/cat", 
      std_out > outdata, 
      std_err > errdata, 
      std_in < in, ios); 

    std::string greeting("hi, there!"); 
    boost::asio::async_write(in, buffer(greeting), [&](boost::system::error_code, size_t) { 
       in.close(); 
      }); 

    ios.run(); 
    std::cout << "stdout: '" << outdata.get() << "'\n"; 
    std::cerr << "stderr: '" << errdata.get() << "'\n"; 
} 

打印

stdout: 'hi, there!' 
stderr: '' 
+0

谢谢。它在API文档中,但我设法完全曲解它.... – choeger