我遇到了从SBCL通过cffi调用C printf函数时遇到的问题。问题是当我调用printf函数时,我无法找到输出文本,只是在REPL上显示printf函数的返回值。但是当我退出SBCL时,输出文本会神奇地出现在终端上。
$ sbcl
* (ql:quickload :cffi)
* (cffi:foreign-funcall "printf" :string "hello" :int)
;;=> 5
* (quit)
hello$
最后一行,"你好$"意味着退出SBCL,文本"你好"出现在终端上,然后是shell提示" $"。那么printf在哪里打印文本"你好"到?
我尝试过`完成输出',`force-output' on * standard-output *但不起作用。
答案 0 :(得分:3)
问题是C的stdio库有自己的缓冲,与Lisp无关。刷新输出需要您指向C的FILE *stdout
变量。你可以像这样得到这个指针:
(cffi:defcvar ("stdout" stdout) :pointer)
然后,在使用printf
后:
(cffi:foreign-funcall "fflush" :pointer stdout :int)