写入子进程的stdin
问题描述:
我正忙着用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
但是输出是空的。我错过了什么?
答
std_in < "hi, there!"
打开一个名为“hi,there!”的文件。并将其输入到子标准输入。
#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
:(?)
你显然需要确保
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: ''
谢谢。它在API文档中,但我设法完全曲解它.... – choeger