Как определить, пуст ли входной поток (но не 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