티스토리 뷰

Programming/C

fflush(), sync()

do9dark 2015. 5. 4. 00:14

int fflush(FILE *stream);

void sync(void);



cache/buffer를 비우는 역할


layer: disk IO(1) - system call(2) - stdio(3)


fflush() 

- library call

- stdio 라이브러리에서 IO를 처리할 때 user level에서 사용하는 버퍼를 비우는 역할 (2,3 사이 버퍼를 비움)

- 사용자 영역(user level)의 버퍼(라이브러리 수준에서 제공되는)를 커널의 버퍼로 이동시키는 역할을 한다.

sync()

- system call

- 시스템(kernel)에서 disk를 사용할 때 kernel level에서 사용하는 버퍼(buffer cache)를 비우는 역할 (1,2 사이 버퍼를 비움)

- 사용자 라이브러리 함수(fprintf, fwrite, fputs 등의 함수)를 사용할 경우 버퍼가 가득 차면 write() 호출한다. 

(터미널에서 사용할 경우에는 개행 문자를 만날때까지 버퍼에 기록해두었다가 write() 함수 호출)

(터미널, 파일 등 기록 매체에 따라 버퍼의 크기와 동작에 차이가 있기 때문에 setvbuf 함수 참고)

write() 사용 시 disk에 바로 기록되는 것이 아니라 커널의 버퍼에 기록이 되고 시스템 커널데몬 중 updated가 30분 간격으로 30분 간격으로 시스템의 커널 버퍼를 디스크로 이동시키는 역할(sync)을 한다.


[+] reference
유닉스는 비동기 파일 시스템을 가지고 있다. 사용자가 A라는 파일을 수정 및 저장해도 실제로 하드디스크에 저장하는 것이 아니라, 커널 내부의 버퍼 캐시에 저장하고 리턴한다. 이후 일정시간이 지나면 버퍼 캐시 운영 알고리즘에 의해서 또는 사용자가 강제로 sync를 호출해서 동기화(실제 디스크에 저장)를 한다.


stream: 연속적인 데이터의 흐름을 추상화시킨 개념 (byte sequence)

TCP를 stream이라고 부르는 이유
예를 들어 $ ps -ef | grep myprog 와 같이 pipe를 사용할 경우

ps 라는 프로그램의 stdout에 pipe를 연결해서 grep 이라는 프로그램의 stdin으로 연결

$ ps -ef > result.txt 는 ps의 output stream을 tty 대신 result.txt 라는 파일로 변경 (stream redirection)


순차적으로 byte 또는 character를 접근하는 interface 또는 그 data를 stream이라고 한다.

Unix에서 (특별한 수식어 없이) stream 또는 stream IO라고 하면 FILE structure를 쓰는 모든 IO를 (fopen/fclose/fread/fwrite 등)을 말한다.

반대로 file descriptor(fd)를 쓰는 interface (open/close/read/write)는 low-level IO라고 한다.


source: https://kldp.org/node/25103
source: https://kldp.org/node/134894



'Programming > C' 카테고리의 다른 글

scanf()  (0) 2014.12.05
댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
링크
공지사항
Total
Today
Yesterday