본문 바로가기

My Study/Function

fopen의 정체

fopen 함수는 ANSI표준 I/O 함수입니다.

다들 써보시면 아시겠지만 

위와 같이 fopen 함수를 사용해 해당 폴더에 파일을 생성하고 해당파일에 문자열을 넣을 수도 있습니다.

즉, fopen을 사용하면 해당 파일이 하드에 저장이 되는 것입니다. 그래서 I/O 함수라고 합니다.

그러면 여기서 또 하나 소개할 함수가 있습니다. 바로
CreateFile
함수 입니다.
윈도우에서 제공하는 API함수입니다. 위 함수도 마찬가지로 파일을 생성 할수 있습니다.


그러면 두 함수에 어떠한 차이점이 있는지 알아보도록 하겠습니다.
결론부터 말씀드리면 윈도우에서 fopen 함수를 사용하면 내부적으로 CreateFile함수를 호출하게 됩니다.
또 리눅스에서 fopen 함수를 사용하면 내부적으로 리눅스만의 시스템 함수를 사용합니다.

결론이지만 결론만 보고도 감이 오신 분들도 계실 것입니다.
fopen 함수는 자기가 파일을 생성하는 것이 아니고 내부적으로 콜 하는 시스템 함수가 파일을 생성하게 되는 것입니다.

하지만 fopen함수는 ANSI표준 함수 이므로 운영체제 별로 제공하는 시스템 함수의 공통적인 부분만 묶어서 사용하는 것입니다. 즉, 시스템 함수가 제공하는 기능을 fopen에서는 제공하지 못할 수도 있다는 것입니다.

각 사용하는 함수의 인자의 개수만 봐도 알 수 있습니다. fopen함수는 생성할 파일 명, I/O방식만을 지정합니다.
반면에 CreateFile함수는 
해당 파일을 다른 프로세스에서 동시 읽기/쓰기가 가능 하도록 할것인지
핸들 정보를 자식 프로세스에게 상속할 것인지
파일을 어떻게 생성할 것인지
파일 생성 시, 읽기 권한, 쓰기 권한, 숨김 권한 등 이런 것을 어떻게 설정 할 것인지
등등 fopen 함수가 제공하지 못하는 기능들을 제공합니다.

이제 사용하는 것은 개발자가 알아서 해야할 것입니다. 하지만 대부분 윈도우에서 파일 생성할 때 CreateFile함수를 사용하지 fopen함수는 잘 사용하지 않더군요.

마지막으로 fopen함수가 내부적으로 CreateFile함수를 진짜로 호출하고 있는지 확인하고 끝내겠습니다.

해당 부분에서 fopen함수를 호출하고 있습니다. 안으로 들어가서 CreateFile함수에 BP를 걸고 실행을 시켜보았습니다.

CreateFile함수에서 멈췄는데요. 인자를 봐보면 아까 fopen함수의 인자로 전달했던 파일을 생성하고 있다는 것을 알 수 있습니다.

'My Study > Function' 카테고리의 다른 글

WriteFile  (0) 2010.02.24
ReadFile  (0) 2010.02.24
CreateFile  (0) 2010.02.24
CreateProcess  (0) 2010.02.24
WaitForSingleObject 함수  (2) 2009.12.09