我正在从Common Lisp程序(gnuplot)中产生一个进程。我能够为流程建立输入和输出流。但是,我从输出中读取时出现问题。问题是我想尝试从输出中读取,如果没有任何内容,那么......不要做任何事情。例如。
(基本问题:我想读取命令show term
的结果,但我想跳过gnuplot在发送此命令之前可能产生的任何其他输出)
如果我只使用(read-line gnuplot-output nil :eof)
并且输出流中没有任何内容,则它不会指示:eof
(因为流仍处于活动状态并且可能会出现某些内容)并且只会阻塞直到它有某些内容阅读(即永远)。
有没有办法检测到没有东西可读?至少,以某种方式安全地超时读取的尝试(即,一旦超时,它不应该从流中弹出新的一行)?
PS。我正在使用SBCL
答案 0 :(得分:5)
Listen
应该告诉您是否有可用的角色。我认为你必须逐个字符而不是整行读取流,除非你确定程序永远不会输出不完整的行。
编辑快速测试(使用sb-ext运行程序):
(defun test ()
(do* ((program (run-program "output-test.sh" nil
:search t
:output :stream
:wait nil))
(output-stream (process-output program)))
((not (process-alive-p program)))
(if (listen output-stream)
(loop
for char = (read-char-no-hang output-stream nil nil)
while char
do (write-char char))
(format t "No output available.~%"))
(sleep 1)))
其中output-test.sh是:
#!/bin/sh
for item in *
do
echo $item
sleep 3
done