Common Lisp:写入外部程序输入
Common Lisp: Write to external program input
我想在 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))
但是这段代码不起作用,我有点卡住了。有什么想法吗?
注意买者:我手头没有 Clozure 实例,我假设这个 run-program
来自 CCL 扩展。
几乎可以肯定,mpg123
可能“还没有”收到您的输出,因为在所有主流系统上 I/O 会(默认情况下)缓冲,直到您达到某个缓冲区大小限制.在 #'write-char
之后添加一个 (finish-output s)
可能会成功。
参见 http://clhs.lisp.se/Body/f_finish.htm — 如果您不关心立即阅读任何回复(例如,如果您正在循环排队很长的播放列表),force-output
可能更合适,但在实践中,它们在某种程度上可以互换。
我想在 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))
但是这段代码不起作用,我有点卡住了。有什么想法吗?
注意买者:我手头没有 Clozure 实例,我假设这个 run-program
来自 CCL 扩展。
几乎可以肯定,mpg123
可能“还没有”收到您的输出,因为在所有主流系统上 I/O 会(默认情况下)缓冲,直到您达到某个缓冲区大小限制.在 #'write-char
之后添加一个 (finish-output s)
可能会成功。
参见 http://clhs.lisp.se/Body/f_finish.htm — 如果您不关心立即阅读任何回复(例如,如果您正在循环排队很长的播放列表),force-output
可能更合适,但在实践中,它们在某种程度上可以互换。