Как определить, пуст ли входной поток (но не EOF)?
Я порождаю процесс из общей программы Lisp (gnuplot). Я могу установить входные и выходные потоки для процесса. Тем не менее, у меня есть проблема с чтением из вывода. Проблема в том, что я хочу попытаться прочитать с выхода, и если там ничего нет, хорошо... например, ничего не делать.
(основная проблема: я хочу прочитать результат команды show term
но я хочу пропустить любой другой вывод, который gnuplot мог бы произвести перед отправкой этого команда)
Если я просто использовать (read-line gnuplot-output nil :eof)
и в выходном потоке ничего нет, он не будет указывать :eof
(так как поток все еще жив, и что-то может появиться там) и будет просто блокировать, пока ему не будет что-то читать (т. е. навсегда).
есть ли способ обнаружить, что читать нечего? По крайней мере, как-то безопасно тайм-аут попытка чтения (т. е. он не должен выскакивать новую строку из потока после достижения тайм-аута)?
PS. Я использую SBCL
1 ответов
Listen
должен сказать вам, есть ли доступный символ. Я думаю, вам придется читать поток символ за символом, а не целые строки за раз, если вы не уверены, что программа никогда не выводит неполную строку.
Edit: быстрый тест (с помощью 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