Редактировать: Я разозлился из-за того, что не смог выполнить эту очень простую задачу, и решил проблему.
Функционально возможность отправки потока типа UNSIGNED-BYTE в run-program и правильной его работы строго ограничена по причинам, которые я не понимаю. Я пробовал серые потоки, flexi-потоки, потоки fd и некоторые другие механизмы, такие как вы.
Однако, просматривая источник запуска программы (в пятый или шестой раз), я заметил, что есть опция: STREAM, которую вы можете передать на выход. Учитывая это, я задавался вопросом, сработает ли чтение байта ... и это сработало. Для более эффективной работы можно определить, как получить длину не файлового потока и выполнить для него READ-SEQUENCE.
(let*
;; Get random bytes
((proc-var (sb-ext:run-program "head" '("-c" "10" "/dev/urandom")
:search t
;; let SBCL figure out the storage type. This is what solved the problem.
:output :stream))
;; Obtain the streams from the process object.
(output (process-output proc-var))
(err (process-error proc-var)))
(values
;;return both stdout and stderr, just for polish.
;; do a byte read and turn it into a vector.
(concatenate 'vector
;; A byte with value 0 is *not* value nil. Yay for Lisp!
(loop for byte = (read-byte output nil)
while byte
collect byte))
;; repeat for stderr
(concatenate 'vector
(loop for byte = (read-byte err nil)
while byte
collect byte))))