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

Posted

技术标签:

【中文标题】如何从 Clojure 调用 C++ 程序以使程序保持打开状态?【英文标题】:How to call a C++ program from Clojure so that the programs stays open? 【发布时间】:2020-06-14 05:23:26 【问题描述】:

假设我想从 Clojure 调用一个 C++ 程序,比如 stockfish。 如果我从终端执行 stockfish,它会保持打开和交互状态,直到命令退出。

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

我用过 me/conch 包的程序宏,像这样:

    user> (programs stockfish)
    user> (stockfish "uci")
    "Stockfish 030620 64 by T. Romstad ... \nuciok\n"

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于如何从 Clojure 调用 C++ 程序以使程序保持打开状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何使clojure程序结构更容易识别?

Clojure:如何从内存中删除对象?

从终端向Clojure应用程序发送消息

从 C++ 调用和控制 GDB

如何使用 C# 从 C++ 应用程序获取调用堆栈?

JNI技术---clojure 调用C++库的方法