sync와 fflush

seeker의 이미지

sync ( fsync )가
커널버퍼를 디스크에 write하고,
fflush는
standard library 내의 버퍼를 커널버퍼에 write하는걸로 알고있는데.
이것이 맞나요?
2개의 차이점을 알고싶습니다.

만약, 그렇다면, write( filedescriptor , buf ,sizeof buf) 동작이 한번 일어날때마다, 디스크파일이 아닌 커널버퍼에 buf내용이 쓰여지는건가요?

또, 그렇다면 write를 이용하더라도 시스템이 갑자기 down(crash)되면
디스크(파일)에 기록되지 않고 날라간 데이터가 있을수있을것같은데요.

june8th의 이미지

fflush man page의 NOTE에 적혀있기를...

fflush는 C 라이브러리에 의해 제공된 사용자 공간의 데이터만 flush한다.
디스크에 확실히 쓰기위해서는, sync나 fsync로 커널 버퍼를 마찬가지로 flush해야 한다.