我有一个进程结构体,它包含一个进程句柄:
pub struct Process {
process: Child,
init: bool
}
我有一个单独的功能,我可以'说话'的引擎。
fn talk_to_engine(&mut self, input: &String) -> String {
let stdin = &mut self.process.stdin.as_mut().unwrap();
stdin.write_all(input.as_bytes()).expect("Failed to write to process.");
let mut s = String::new();
return match self.process.stdout.as_mut().unwrap().read_to_string(&mut s) {
Err(why) => panic!("stdout error: {}", why),
Ok(_) => s
}
}
然而当我运行这个函数时,我在终端中得到一个 Flink 的光标,它什么也不做。
编辑:我调用init_engine函数,该函数依次调用上述函数:
/// Initialize the engine.
pub fn init_engine(&mut self, _protocol: String, depth: String) {
//Stockfish::talk_to_engine(self, &protocol);
let output = Stockfish::talk_to_engine(self, &format!("go depth {}", &depth));
print!("{:?}", output);
self.init = true;
}
如果您调用init_engine,比方说,如下所示:struct.init_engine("uci".to_string(), "1".to_string());
1条答案
按热度按时间gjmwrych1#
如果没有任何信息,一个完整的复制情况,甚至不知道什么是输入和子进程,这是不可能知道,很难猜测。特别是当你显然甚至没有试图找到什么是阻塞的确切。
但我在这里可以看到两个可能的问题点:
1.驱动程序只会在所有输入都被使用后读取输出,如果子进程交叉阅读,它可能会填满整个输出管道的缓冲区 *,然后永远阻止写入标准输出 *,基本上是死锁。
read_to_string
读取整个流,这意味着子进程必须写出所有内容 * 并终止或至少关闭其stdout*,否则可能会有更多输出,驱动程序将继续等待它。