Common Lisp:写入外部程序输入

时间:2016-06-21 10:39:13

标签: common-lisp ccl

我想在CL / CCL中为mpg123控制台mp3播放器编写一个简单的包装器,并想知道如何写入mpg123,它作为一个衍生过程存在:

(let* ((p (run-program "mpg123" '("-R") :input :stream :output :stream :wait nil))
       (s (external-process-input-stream p)))

  (write "LOAD /path/to/file.mp3" :stream s)
  (write-char #\return s))

但是这段代码不起作用,我有点卡住了。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

警告经纪人:我没有方便的Clozure实例,我假设此run-program来自CCL扩展。

几乎可以肯定,mpg123可能还没有接收到你的输出,因为在所有主流系统中,I / O(默认情况下)都会被缓冲,直到达到一些缓冲区大小限制。在(finish-output s)之后添加#'write-char可能会有所帮助。

如果您不担心立即阅读任何回复(例如,如果您在循环中排队长播放列表),请参阅http://clhs.lisp.se/Body/f_finish.htm - force-output可能更合适,但在实践中,它们有点可以互换。