mob*_*eng 6 lisp gnuplot sbcl common-lisp
我正在从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)))
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)