【发布时间】:2019-07-30 00:07:38
【问题描述】:
我正在尝试生成一个 shell 并读取标准输出和标准错误,并让用户通过写入标准输入来运行命令。我似乎无法从 stdout 或 stderr 读取数据,而且写入 stdin 显然也无济于事。
如果我不尝试重定向任何 stdin、stdout 或 stderr,它会生成一个正常的 shell,就像我期望的那样。然而,重定向它们只会让一切都消失。 >> 只是神秘地挂起。我从孩子的标准输出中取出,然后将其放回实际的标准输出中,所以我希望至少会出现类似我的用户名的内容,但就像我说的那样,它只是阻塞,因为缓冲区中必须没有任何内容。
boost::process::child shell;
boost::process::opstream instream;
boost::process::ipstream errstream;
boost::process::ipstream outstream;
void console_out_read()
{
char ch;
do
{
outstream >> ch;
std::cout << ch;
}
while(true);
}
void console_err_read()
{
char ch;
do
{
errstream >> ch;
std::cerr << ch;
}
while(true);
}
void console_in_write()
{
int ch;
do
{
std::cin >> ch;
instream << ch;
}
while(true);
}
int main()
{
std::error_code ec;
shell = boost::process::child("bash",
boost::process::std_out > outstream,
boost::process::std_err > errstream,
boost::process::std_in < instream,
ec);
boost::thread cro(console_out_read);
boost::thread cre(console_err_read);
boost::thread cwi(console_in_write);
shell.wait();
return 0;
}
【问题讨论】:
-
console_out_read永远不会对ch做任何事情并且永远不会返回。
标签: c++ multithreading boost io