표준 입출력 라이브러리는 사용자 버퍼를 커널 버퍼로 옮길 수 있도록 인터페이스를 제공한다. 스트림에 쓰여진 모든 데이터가 write() 시스템 콜을 통해 실제로 커널 버퍼로 옮겨갈 수 있도록 하는 것이다. 앞서 설명한 것처럼 write()를 통해 커널 버퍼로 옮겨진 데이터는 운영체제에 의해 디스크에 쓰여진다.
(시스템 콜을 사용하지 않은 데이터의 입출력은 사용자 버퍼에서 상호작용한다.)
#include <stdio.h>
int fflush(FILE *stream);
이 함수를 호출하면 stream에 있는 쓰지 않은 데이터를 커널로 비운다. stream이 NULL이면 프로세스의 열려있는 모든 입력 스트림이 비워진다. fflush()가 성공하면 0을 반환하고, 실패하면 EOF를 반환하고 errno를 적절한 값으로 설정한다.
fflush()의 효과를 이해하려면 C 라이브러리가 관리하는 버퍼와 커널이 유지하는 버퍼가 어떻게 다른지 이해해야 한다. 여기서 시스템 콜을 제외한 함수 호출은 C 라이브러리가 관리하는 버퍼를 사용하며 이 버퍼는 커널 영역이 아니라 사용자 영역에 위치한다. 이게 바로 성능 개선이 일어나는 부분인데 프로그램은 사용자 영역에 존재하면서 시스템 콜을 사용하지 않고 사용자 코드를 실행한다. 그러므로 시스템 콜은 필요할 때만 호출되고 이는 성능 향상으로 이어진다.
fflush()는 단지 사용자 버퍼에 있는 데이터를 커널 버퍼로 쓰기만 한다. 이는 사용자 버퍼를 사용하지 않고 write()를 직접 사용하는 효과와 동일하다. 그러나 fflush()가 데이터를 매체에 물리적으로 기록한다는 보장은 없다. 이렇게 하려면 앞서 설명한 내용대로 fsync()를 호출해야한다.