如何检测输入流是否为空(但不是EOF)?

时间:2016-01-25 10:41:21

标签: lisp gnuplot common-lisp sbcl

我正在从Common Lisp程序(gnuplot)中产生一个进程。我能够为流程建立输入和输出流。但是,我从输出中读取时出现问题。问题是我想尝试从输出中读取,如果没有任何内容,那么......不要做任何事情。例如。

(基本问题:我想读取命令show term的结果,但我想跳过gnuplot在发送此命令之前可能产生的任何其他输出)

如果我只使用(read-line gnuplot-output nil :eof)并且输出流中没有任何内容,则它不会指示:eof(因为流仍处于活动状态并且可能会出现某些内容)并且只会阻塞直到它有某些内容阅读(即永远)。

有没有办法检测到没有东西可读?至少,以某种方式安全地超时读取的尝试(即,一旦超时,它不应该从流中弹出新的一行)?

PS。我正在使用SBCL

1 个答案:

答案 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