rust Flink 光标时stdout挂起

qncylg1j  于 2023-03-08  发布在  Flink
关注(0)|答案(1)|浏览(222)

我有一个进程结构体,它包含一个进程句柄:

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());

gjmwrych

gjmwrych1#

如果没有任何信息,一个完整的复制情况,甚至不知道什么是输入和子进程,这是不可能知道,很难猜测。特别是当你显然甚至没有试图找到什么是阻塞的确切。
但我在这里可以看到两个可能的问题点:
1.驱动程序只会在所有输入都被使用后读取输出,如果子进程交叉阅读,它可能会填满整个输出管道的缓冲区 *,然后永远阻止写入标准输出 *,基本上是死锁。

  1. read_to_string读取整个流,这意味着子进程必须写出所有内容 * 并终止或至少关闭其stdout*,否则可能会有更多输出,驱动程序将继续等待它。

相关问题