C printf

时间:2015-06-12 08:53:51

标签: io common-lisp cffi

我遇到了从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 *但不起作用。

1 个答案:

答案 0 :(得分:3)

问题是C的stdio库有自己的缓冲,与Lisp无关。刷新输出需要您指向C的FILE *stdout变量。你可以像这样得到这个指针:

 (cffi:defcvar ("stdout" stdout) :pointer)

然后,在使用printf后:

(cffi:foreign-funcall "fflush" :pointer stdout :int)