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

mob*_*eng 6 lisp gnuplot sbcl common-lisp

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

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

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

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

PS.我正在使用SBCL

jki*_*ski 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)))
Run Code Online (Sandbox Code Playgroud)

output-test.sh的位置是:

#!/bin/sh
for item in *
do
    echo $item
    sleep 3
done
Run Code Online (Sandbox Code Playgroud)