管道命令使标准输入损坏

时间:2017-08-17 14:05:35

标签: linux shell unix pipe

我有两个流程:t1.cppt2.cpp

t1.cppt2.cpp已简化,我想轻松描述问题。

//t1.cpp
#include <iostream>
using namespace std;
int main()
{
    cout << "hello\n"
         << "world\n"
         << "ok ok\n";
    return 0;
}

//t2.cpp
#include <iostream>
#include <limits>
using namespace std;
int main()                                                                                                                                                                                                    
{
    string str;
    while(getline(cin,str)){
        cout << str <<endl;
    }

    //cin.clear();
    //flush the cin
    //cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');

    char x;
    cin >> x;
    return 0;
} 

编译t1.cppt2.cpp后。我以这种方式./t1 | ./t2执行它们。

出现问题! cin >> x;中的t2.cpp失败了!我没有机会从键盘输入。

似乎管道命令由redirecting the STDIN_FILENO实现。它是否同时禁止标准输入?

我的苛刻要求是使用shell命令t1|的输出中获取数据,此外,我希望与t2中的用户进行交互。例如,我将显示{{ 1}}

2 个答案:

答案 0 :(得分:0)

实际上,您可以在C ++代码中执行某些操作。 t1必须从stdin读取并回显到stdout,它被重定向。你可以在不同的地方做这样的事情:

T value;
std::cin >> value;
std::cout << value;

或者在注释中模拟shell命令的行为(在t1将数据写入stdout后追加stdin):

std::copy(std::istreambuf_iterator<char>(std::cin),
          std::istreambuf_iterator<char>(),
          std::ostreambuf_iterator<char>(std::cout));

答案 1 :(得分:0)

最后,我们使用“/ dev / tty”

解决了这个问题
FILE *file = fopen("/dev/tty","r");
if(NULL == file){
    /*error*/
}
int ch = fgetc(file);
if('y' == ch || 'Y' == ch){
    /*balabala*/
}

stdinstdout被重定向时,我们也可以从/dev/tty读取或写入。