【问题标题】:Writing to stdin of a child process写入子进程的标准输入
【发布时间】:2017-08-31 08:21:22
【问题描述】:

我正在玩弄 boost 进程库。但由于某些原因,我无法向标准输入发送内容:

#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

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

【问题讨论】:

    标签: c++ boost process boost-asio


    【解决方案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 在发送缓冲区后关闭 (?)

    #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: ''
    

    【讨论】:

    • 谢谢。它在 API 文档中,但我设法完全误解了它....
    猜你喜欢
    • 1970-01-01
    • 2012-01-18
    • 2018-08-19
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多