繁体   English   中英

无法在SBCL sb-ext:run-program中获取输入流

[英]Cannot get input stream working in SBCL sb-ext:run-program

虽然以下工作:

(let* ((i (make-string-input-stream "foo bar baz"))
       (p (sb-ext:run-program "/bin/cat" '() 
              :input i :output *trace-output* :wait t)))
  (sb-ext:process-close p))

下面的代码没有 - 它会在写“001”后停止:

(let* ((_1 (format t "001~%"))
       (p (sb-ext:run-program "/bin/cat" '() 
              :input :stream :output *trace-output* :wait t))
       (_2 (format t "010~s~%" p))
       (s (sb-ext:process-input p)))
  (declare (ignore _1 _2))
  (format s "foo bar baz~%")
  (finish-output s)
  (sb-ext:process-close p))

所以它似乎默默地将执行留在sb-ext:run-program

这与Ubuntu 16.04.1上的SBCL 1.3.6有关。

有任何想法吗? 先谢谢你,弗兰克

正如我在评论中提到的,问题是:WAIT T参数。 它导致调用SB-EXT:RUN-PROGRAM在子进程退出之前不返回。

在第一个示例中,您将字符串输入流传递给子进程。 cat将从流中读取输入,当输入结束时将出现文件结束,因此cat退出。 在第二个例子中,程序没有可用的输入,所以它实际上是一个无限循环(就像你在命令行上运行cat ,并且不给它任何输入;它永远不会退出)。

解决方案是使用:WAIT NIL 您还必须使用CLOSE输入流,否则将不会有EOF并且cat会继续侦听更多输入。 关闭流后,您还需要使用SB-EXT:PROCESS-WAIT等待cat退出。

(let* ((p (sb-ext:run-program "/bin/cat" '() 
                              :input :stream
                              :output *standard-output*
                              :wait nil))
       (s (sb-ext:process-input p)))
  (format s "foo bar baz~%")
  (finish-output s)
  (close s)
  (sb-ext:process-wait p)
  (sb-ext:process-close p))

我不确定为什么你使用*TRACE-OUTPUT*作为子输出,所以我将它改为*STANDARD-OUTPUT*

另外,使用FORMAT进行调试就好了。 Common Lisp提供实际的调试工具。 在这种情况下,您可以使用STEP

(step (let* ((p (sb-ext:run-program "/bin/cat" '() 
                                    :input :stream
                                    :output *standard-output*
                                    :wait nil))
             (s (sb-ext:process-input p)))
        (format s "foo bar baz~%")
        (finish-output s)
        (close s)
        (sb-ext:process-wait p)
        (sb-ext:process-close p)))

这将使您进入调试器,显示接下来要评估的调用。 您可以调用STEP-NEXT -restart继续下一个呼叫。

正如jkiiski所建议的那样 ,这是有效的

(let* ((p (sb-ext:run-program "/bin/cat" '() 
                              :input :stream 
                              :output *standard-output* 
                              :wait nil))
       (s (sb-ext:process-input p)))
  (format s "foo bar baz~%")
  (finish-output s)
  (sb-ext:process-wait p)
  (sb-ext:process-close p))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM