尊敬的StackExchange成员,
我最近开始尝试使用Common Lisp,并希望创建一个用于管理修改后的Minecraft服务器的Web界面。我已经尝试过此解决方案,但是在这种情况下,该函数只是挂起而永不返回。
我的代码如下所示:
(defvar *proc*)
(defun create-minecraft-proc ()
(let* ((binary "/usr/bin/java")
(jar "/home/user/temp/Vanilla 1.8/minecraft.jar")
(dir "/home/user/temp/Vanilla 1.8")
(args (list "-jar" jar "nogui")))
(setf *proc* (sb-ext:run-program binary args :directory dir :wait nil :input :stream :output :stream))))
(defun copy-stream (in out)
(loop for line = (read-line in nil nil)
while line
do (write-line line out)))
(defun get-minecraft-output ()
(with-open-stream (proc-stream (process-output *proc*))
(with-output-to-string (out)
(copy-stream (process-output *proc*) out)))
如何获得一个字符串,其中包含直到那时的完整进程输出,而不必等待其终止?
通过试用/bin/cat
,我发现了一些可能对您有所帮助的东西。
首先,请务必finish-output
在写入过程输入后使用:
(format (process-input *cat*) "Hello~%")
(finish-output (process-input *cat*))
否则,除非关闭输入流,否则输入可能无法到达子流程。如果Minecraft在生成任何输出之前需要输入,那么尝试在没有所需输入的情况下从其输出中读取将导致SBCL挂起,而这种方式无法用SLIME中的Cc Cc恢复。
其次,用于listen
确定是否已生成任何输出:
(when (listen (process-output *cat*))
(read-line (process-output *cat*)))
使用finish-output
和listen
,可以逐步从cat的标准输出中读取内容时避免挂起。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句