如何从Clojure调用C++程序,以使程序保持打开状态?

How to call a C++ program from Clojure so that the programs stays open?

本文关键字:程序 状态 Clojure 调用 C++      更新时间:2023-10-16

假设我想调用来自Clojure的C++程序,比如鳕鱼干。 如果我从终端执行鱼干,它会保持打开和交互,直到命令退出。

但是,如果我从 Clojure 打电话,它只会调用它一次并关闭它。

我使用了me/conch包的程序宏,如下所示:

user> (programs stockfish)
user> (stockfish "uci")
"Stockfish 030620 64 by T. Romstad ... nuciokn"

程序停止。我怎样才能让流程保持开放并保持互动,直到我告诉它退出?

这类问题在Unixexpect工具中有一个规范的解决方案,例如,在Perl的Expect模块中得到了复制。 也可能有一个Java版本的Expect。 如果是这样,这可能是一个更直接的解决方案。

具体到海螺,https://github.com/Raynes/conch 的README.md提供了两种调用程序的方法。 第一种方法很简单,但正如您所观察到的,在关闭程序之前只发送一次标准输入。 第二种方法将更难使用,但您可以通过写入进程的标准输入随时发送更多输入,并通过从其标准输出读取来随时恢复输出。 它在标题 https://github.com/Raynes/conch#low-level-usage 下。 它看起来像是围绕Java进程API的薄包装器,您也可以直接使用它。