是否可以写入在另一个线程中使用system命令启动的可执行文件的std :: cin?

时间:2014-09-21 09:42:11

标签: c++ multithreading c++11 system cin

我对多线程很陌生。我想在一个单独的线程中从我的代码中启动一个可执行文件。此外部程序从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表示的代码是别人的代码,我想尽可能少地改变它并且能够用另一个类似的程序替换它容易。

非常感谢任何帮助。

0 个答案:

没有答案