sbcl 运行-当程序有大量输出时程序挂起
sbcl run-program hang when there is large amount of output from program
最近我发现一个运行-sbcl 1.2.7 (32bits, linux) 的程序挂起问题。代码如下
(progn
(with-open-file (s "test.out" :direction :output :if-exists :supersede)
(loop repeat 900 do (write-line (make-string 76 :initial-element #\x) s)))
(run-program "/bin/bash" (list "-c" "cat test.out") :output :stream))
也就是说,当“cat test.out”向进程对象的进程输出流产生多行输出时,`运行-program' 调用将永远挂起。在我的测试机上,当行数大于 900 时,就会出现这个问题。否则就好了。当输出数据写入进程输出流时,我怀疑这个问题是由某种块(也许缓冲区已满?)引起的。如果我们按如下方式更改代码(避免将数据写入进程输出流),运行-程序立即调用 returns:
(length
(with-output-to-string (s)
(run-program "/bin/bash" (list "-c" "cat test.out")
:output s)))
;;=> 69300
我不知道这是否是一个错误。有什么方法可以在挂起问题发生时 return 调用吗?
还有一个类似的问题:how-to-read-from-large-process-output-correctly,但我不明白为什么 运行-程序调用挂在那里。
我也认为这可能是一些缓冲区问题。但是,如果您逐行读取 :stream,则效果很好:
(let ((process
(run-program "/bin/bash" (list "-c" "cat test.out") :output :stream :wait nil)))
(loop for line = (read-line (process-output process) nil :eof)
until (eq line :eof)
do (print line)))
最近我发现一个运行-sbcl 1.2.7 (32bits, linux) 的程序挂起问题。代码如下
(progn
(with-open-file (s "test.out" :direction :output :if-exists :supersede)
(loop repeat 900 do (write-line (make-string 76 :initial-element #\x) s)))
(run-program "/bin/bash" (list "-c" "cat test.out") :output :stream))
也就是说,当“cat test.out”向进程对象的进程输出流产生多行输出时,`运行-program' 调用将永远挂起。在我的测试机上,当行数大于 900 时,就会出现这个问题。否则就好了。当输出数据写入进程输出流时,我怀疑这个问题是由某种块(也许缓冲区已满?)引起的。如果我们按如下方式更改代码(避免将数据写入进程输出流),运行-程序立即调用 returns:
(length
(with-output-to-string (s)
(run-program "/bin/bash" (list "-c" "cat test.out")
:output s)))
;;=> 69300
我不知道这是否是一个错误。有什么方法可以在挂起问题发生时 return 调用吗?
还有一个类似的问题:how-to-read-from-large-process-output-correctly,但我不明白为什么 运行-程序调用挂在那里。
我也认为这可能是一些缓冲区问题。但是,如果您逐行读取 :stream,则效果很好:
(let ((process
(run-program "/bin/bash" (list "-c" "cat test.out") :output :stream :wait nil)))
(loop for line = (read-line (process-output process) nil :eof)
until (eq line :eof)
do (print line)))