C printf 打印的文本在哪里

where is the text printed by C printf

我在通过 cffi 从 SBCL 调用 C printf 函数时碰巧遇到了问题。问题是当我调用 printf 函数时,我找不到输出文本,只是 REPL 上显示的 printf 函数的 return 值。但是当我退出 SBCL 时,输出文本神奇地出现在终端上。

  $ sbcl
  * (ql:quickload :cffi)
  * (cffi:foreign-funcall "printf" :string "hello" :int)
  ;;=> 5
  * (quit)
  hello$ 

最后一行,"hello$" 表示当从 SBCL 退出时,文本 "hello" 出现在终端上,然后是 shell 提示符“$”。那么printf将文本"hello"打印到哪里呢?

我在 *standard-output* 上尝试过“finish-output”、“force-output”,但没有用。

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

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

然后,使用printf后:

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

写在flush.c:

#include <stdio.h> 
void flush() { 
    fflush(stdout); 
}

然后:
gcc -fpic -shared flush.c -o flush.so

然后在 SLIME 中:

(cffi:load-foreign-library "./flush.so")
(cffi:foreign-funcall "puts" :string "Hello World" :int)
(cffi:foreign-funcall "flush")

但仅在 *inferior-lisp* 中打印,即使 (with-output-to-string (*standard-output*...)