C 표준 I/O: fopen, fclose, fread, fwrite
POSIX 표준 I/O: open, close, read, write
이 차이를 말씀하시는 건가요?
C 표준 입출력 함수는 응용프로그램의 프로세스 내부적으로 중간에 버퍼를 할당하도록 되어 있습니다. 이때문에 C 표준 입출력을 buffered i/o 라고 합니다. 예컨데 fread에서 1바이트만 읽어도 사실 커널로부터는 C 라이브러리 내부적으로 정한 버퍼 크기만큼 우선 읽어옵니다. 그리고 다음 번 fread를 호출할 경우 버퍼에 있는 만큼은 커널에서 읽어오지 않고 버퍼에서만 읽어옵니다. 따라서 작은 데이터를 반복적으로 읽는 경우에는 시스템콜을 많이 하지 않아서 효율적입니다. C 표준에는 버퍼가 없는 입출력은 정의되어있지 않습니다.
반면에 POSIX 표준 입출력 함수는 중간에 버퍼가 존재하지 않습니다. read를 호출하면 이 때 지정한 만큼의 데이터만 커널에서 읽어옵니다. 즉, read는 호출될 때마다 항상 커널에서 바로 읽어옵니다. (따라서 unbuffered i/o라고 합니다.)
보통은 C 표준 I/O는 단지 중간에 버퍼가 있는 POSIX I/O의 wrapper인 경우가 많습니다. 그래도 C 표준 I/O는 fprintf, fscanf 같은 고수준의 포멧팅을 지원한다는 장점이 있겠지요.
C 라이브러리의 IO 함수가 시스템콜의 wrapper 아닌가요?
C 라이브러리의 IO 함수가 시스템콜의 wrapper 아닌가요?
----
http://www.planetmono.org
C 표준 I/O: fopen, fclose, fread, fwrite
C 표준 I/O: fopen, fclose, fread, fwrite
POSIX 표준 I/O: open, close, read, write
이 차이를 말씀하시는 건가요?
C 표준 입출력 함수는 응용프로그램의 프로세스 내부적으로 중간에 버퍼를 할당하도록 되어 있습니다. 이때문에 C 표준 입출력을 buffered i/o 라고 합니다. 예컨데 fread에서 1바이트만 읽어도 사실 커널로부터는 C 라이브러리 내부적으로 정한 버퍼 크기만큼 우선 읽어옵니다. 그리고 다음 번 fread를 호출할 경우 버퍼에 있는 만큼은 커널에서 읽어오지 않고 버퍼에서만 읽어옵니다. 따라서 작은 데이터를 반복적으로 읽는 경우에는 시스템콜을 많이 하지 않아서 효율적입니다. C 표준에는 버퍼가 없는 입출력은 정의되어있지 않습니다.
반면에 POSIX 표준 입출력 함수는 중간에 버퍼가 존재하지 않습니다. read를 호출하면 이 때 지정한 만큼의 데이터만 커널에서 읽어옵니다. 즉, read는 호출될 때마다 항상 커널에서 바로 읽어옵니다. (따라서 unbuffered i/o라고 합니다.)
보통은 C 표준 I/O는 단지 중간에 버퍼가 있는 POSIX I/O의 wrapper인 경우가 많습니다. 그래도 C 표준 I/O는 fprintf, fscanf 같은 고수준의 포멧팅을 지원한다는 장점이 있겠지요.
^^
Windows 에서는 API 를 Wrapping 합니다. :D
fopen, fread, fwrite 등등에서
CreateFile, ReadFile, WriteFile 등을 사용하죠.
C 라이브러리는 플래폼 마다 서로 Wrapping 하는 것은 다르지만 같은 Prototype 과 (어느정도)같은 동작을 보장해 주겠죠. 8)
-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com
댓글 달기