2015-06-12 2 views
1

У меня возникла проблема с вызовом функции C printf из SBCL через cffi. Проблема в том, что когда я вызываю функцию printf, я не могу найти выходной текст, а только возвращаемое значение функции функции printf на REPL. Но когда я выхожу из SBCL, выходной текст появляется на терминале магически.где текст напечатан C printf

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

последняя строка, «привет $» означает, когда выйти из SBCL, появляется текст «привет» на терминал и с той строкой «$». Итак, где printf печатает текст «привет»?

Я попробовал `finish-output ',` force-output' on * standard-output *, но это не работает.

+1

Обычно выглядит выход в буфер и вам нужно сказать C, чтобы очистить буфер. –

ответ

3

Проблема в том, что библиотека stdio C имеет свою собственную буферизацию, которая не имеет ничего общего с Lisp's. Для промывки вывода требуется указатель на переменную FILE *stdout. Вы можете получить этот указатель, как это:

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

Затем, после использования printf:

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

Да, это работает. Большое спасибо. – xiepan

Смежные вопросы