关闭boost :: process child

时间:2017-05-29 09:52:52

标签: c++ boost stdin boost-process

我正在尝试使用Boost-1.64.0将带有字符串的进程调用到其stdin。 目前的代码是:

  bp::opstream inStream ;
  bp::ipstream outStream;
  bp::ipstream errStream;

  bp::child child(
    command, // the command line
    bp::shell,
    bp::std_out > outStream,
    bp::std_err > errStream,
    bp::std_in  < inStream);


  // read the outStream/errStream in threads

  child.wait();

问题是子可执行文件正在等待其stdin EOF。这里child.wait()无限期地悬挂......

我尝试使用asio :: buffer,std_in.close(),...但没有运气。 我发现的唯一的黑客是删除()inStream ......这并不是真的可靠。

我应该如何“通知”子进程并使用新的boost :: process库关闭其stdin?

谢谢!

2 个答案:

答案 0 :(得分:2)

  

我尝试使用asio :: buffer,std_in.close()

这很有效。当然,只有将它传递给启动函数(bp ::子构造函数,bp :: system等)才有效。

如果您需要传递数据,然后关闭它,只需关闭相关的文件描述符即可。我做这样的事情:

boost::asio::async_write(input, bp::buffer(_stdin_data), [&input](auto ec, auto bytes_written){
    if (ec) {
        logger.log(LOG_WARNING) << "Standard input rejected: " << ec.message() << " after " << bytes_written << " bytes written";
    }
    may_fail([&] { input.close(); });
});

input

的位置
bp::async_pipe input(ios);

另外,检查进程实际上是否卡在发送输出中!如果你没有消耗输出,它将缓冲并等待缓冲区已满。

答案 1 :(得分:1)

完成写入后,通过调用inStream.close();来关闭管道。您也可以在使用bp::std_in.close()启动时关闭它。

asio解决方案当然也有效并避免了死锁的危险。