我对多线程很陌生。我想在一个单独的线程中从我的代码中启动一个可执行文件。此外部程序从std :: cin获取用户输入。我希望我的主线程提供命令,而不是要求用户输入。这是一个最小的代码,试图做问题的标题是什么
#include <iostream>
#include <sstream>
#include <streambuf>
#include <thread>
std::stringstream cin_redirect;
void InitSample()
{
std::system("./sample_exe");
}
void IssueCommand(const std::string& cmd)
{
cin_redirect << cmd << std::endl;
}
int main()
{
std::streambuf *backup = std::cin.rdbuf(); // back up cin's streambuf
std::streambuf *psbuf = cin_redirect.rdbuf();
std::cin.rdbuf(psbuf);
std::thread sample_thread(InitSample);
for (unsigned i = 0; i < 3; ++i)
{
IssueCommand("hello");
}
IssueCommand("quit");
sample_thread.join();
std::cin.rdbuf(backup); // Restore old situation
return 0;
}
可执行的sample_exe是预编译的,在这个最小的例子中只是这个
//Code of sample_exe.cpp, pre-compiled
#include <iostream>
#include <string>
int main()
{
std::string command ("");
while (command !="quit")
{
std::getline(std::cin,command);
std::cout<<command<<std::endl;
}
return 0;
}
预期输出
hello
hello
hello
quit
如果我只是将sample_exe.cpp的代码复制并粘贴到我的InitSample方法中,我就能确切地获得。但是,系统命令似乎完全忽略了我对std :: cin的重定向。
我感兴趣的是能够使用预编译的可执行文件sample_exe:sample_exe.cpp表示的代码是别人的代码,我想尽可能少地改变它并且能够用另一个类似的程序替换它容易。
非常感谢任何帮助。