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

How to detect if input stream is empty (but not EOF)?

我正在从 Common Lisp 程序 (gnuplot) 生成一个进程。我能够为流程建立输入和输出流。但是,我在读取输出时遇到问题。问题是我想尝试从输出中读取,如果那里什么也没有,那么...例如什么也不做。

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

如果我只使用 (read-line gnuplot-output nil :eof) 并且输出流中没有任何内容,它不会指示 :eof (因为流仍然存在并且可能会出现一些东西)并且只会阻塞直到它有东西要读(即永远)。

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

PS。我正在使用 SBCL

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