如何检测输入流是否为空(但不是 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
我正在从 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