我有两个流程:t1.cpp
和t2.cpp
。
t1.cpp
和t2.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.cpp
和t2.cpp
后。我以这种方式./t1 | ./t2
执行它们。
出现问题! cin >> x;
中的t2.cpp
失败了!我没有机会从键盘输入。
似乎管道命令由redirecting the STDIN_FILENO
实现。它是否同时禁止标准输入?
我的苛刻要求是使用shell命令t1
从|
的输出中获取数据,此外,我希望与t2
中的用户进行交互。例如,我将显示{{ 1}}
答案 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*/
}
当stdin
或stdout
被重定向时,我们也可以从/dev/tty
读取或写入。