본문 바로가기

코드^학습/메모한 지식

fflush 함수

코딩하다보면 종종쓰게 되는 fflush함수


씹어먹는 C언어 강좌의 블로그를 찾아보면 [http://itguru.tistory.com/57]


스트림을 비운다(flush)

만일 함수의 인자로 전달된 스트림이 쓰기 가능하고, 마지막 입출력 작업이 출력 작업이였다면 출력 버퍼에 쓰이지 않고 남아 있던 데이터들은 모두 파일에 쓰이게 된다.

만일 함수의 인자로 전달된 스트림이 읽기 가능하고 마지막 입출력 작업이 입력 작업이였다면, 이 함수가 어떠한 작업을 할지에 대해선 라이브러리에 따라 다르다. 몇몇의 라이브러리에선 입력 버퍼를 비워버리지만(이 때 비운다는 것은 버퍼에 있는 데이터들을 모두 삭제한다는 뜻이다) 이는 표준으로 정해진 것이 아니다.

만일 인자가 널 포인터라면 모든 열린 스트림을 비운다. 

이 함수 호출 이후에도 스트림은 열려 있는 상태로 남아있다.


라고 정의되어 있다. 한 번에 눈에 안 들어오겠지만 여러번 읽다보면 이해가 간다.


인자에는 stream이 들어간다. 작업을 수행할 buffered (스트림의 상태 중 하나로 fully buffered 와 line buffered 를 일컫는다. fully buffered는 버퍼에 채운다음에 장비에 쓰는 방식을 말하고 line buffered는 개행문자가 입력될 때마다 장비에 쓰는것을 말한다.) 스트림의 파일 객체를 가리키는 포인터가 들어간다. 고로 버퍼주소를 이용.(간단히 생각해서)


만약 fflush(stdout)이라면 출력버퍼를 비우면서 목적지로 보내라(쓰라)

fflush(stdin)이라면 입력버퍼를 비우면서 목적지에 도달시키지 말고 버려라 란 뜻이다.(보통은...)


리턴값이 0이면 성공했다는 뜻이고 오류가 일어나면 EOF를 리턴한다.



간단히 몇가지 더 찾아봤는데

KLDP에서 보면 sync()와 fflush()에 대한 질문도 있다.

두 함수가 비슷한 기능을 수행하는데 어떤 차이가 있냐는 질문인데

답변을 읽어보면 저렇게 자세하게 알고있는 사람들이 있구나 하고 알게되는데

http://kldp.org/node/25103 자세한건 여기로 들어가서 확인하길 바란다.


그래도 요약해보자면

fflush는 libaray call이고, sync는 system call

fflush는 stdio라이브러리에서 I/O를 처리할 때 user level에서 사용하는 버퍼를 비우고

sync는 시스템에서 disk를 사용할 때 kernel level에서 사용하는 버퍼를 비우는 역할


sync() : 시스템(kernel) 차원

커널내부(kernel level)의 버퍼캐시(buffer cache)의 내용 중 저장이 필요한 블럭을 실제로 디스크에 write한다.

fflush() : 응용프로그램 차원

사용자 영역(user level)의 버퍼(라이브러리 수준에서 제공되는)의 내용을 커널로 보낸다.


당근 한두번 읽어봐선 이해가 당장 안 간다.(난 그렇다) 그래서 세번정도 읽으면서 운영체제시간에 배운걸 기억해내면서 읽으니 이해가 가는거 같다.


어떤 블로그에서는 이 방법이 이식성이 부족하기 때문에 이식성이 뛰어난 프로그램을 만들땐 사용하지 않는편이 좋다고 충고하고 있다.




p.s. 여기서 스트림이라는 단어가 나오는데 스트림이 어떤 뜻이냐 하면...

스트림의 뜻을 물어본 KLDP의 질문과 답변 :  [http://kldp.org/node/134894]

위키백과의 스트림 의미 : [http://ko.wikipedia.org/wiki/%EC%8A%A4%ED%8A%B8%EB%A6%BC_(%EC%BB%B4%ED%93%A8%ED%8C%85)]

fully buffered와 line buffered의 내용설명 : [http://itguru.tistory.com/62]


데이타흐름의 추상적인 개념으로 특정 하나만의 의미로 제한하기는 어려운듯하다.

입출력,네트워크 등에서 쓰이는 데이터의 근원 이정도가 축약했다할까...