A comparison of f-versions and non-f-versions of the I/O functions
24 Mar 2019 - breadkey
f-version 입출력 함수와 non-f-version 함수의 차이점은 다음과 같이 크게 2가지로 볼 수 있다.
1. 각 함수들을 정의하고 있는 라이브러리
1.1 C 표준 입출력 라이브러리
C 언어를 위한 표준 라이브러리 중 핵심 입출력 함수들을 정의하고 있는 라이브러리이다. C 언어를 위해 존재하므로 어느 환경, 어느 운영체제에서도 사용할 수 있다.
f-version의 파일 입출력 함수들을 정의하고 있다.
파일의 입출력을 다룰 때 FILE * 즉 FILE Pointer를 통해 파일 입출력을 다룬다. high-level 파일 입출력이다.
1.2 C POSIX 파일 입출력 라이브러리
이식성 높은 UNIX 응용 프로그램을 개발하기 위해 정의한 공통 API인 POSIX(출처)에서 파일 입출력 함수들을 정의하고 있는 라이브러리이다. UNIX를 위해 존재하므로 UNIX계열이 아닌 운영체제, 즉 Windows 운영체제에서는 해당 라이브러리를 사용할 수 없다.
non-f-version의 파일 입출력 함수들을 정의하고 있다.
Integer 자료형인 File Descriptor를 통해 파일 입출력을 다룬다. System Call을 사용하는 low-level 파일 입출력이다.
여기있는 함수를 통해 표준 입출력의 함수들(f-version)을 구현할 수 있다.
2. 입출력을 다루는 매개체
2.1 FILE Pointer
f-version 함수에서 파일 입출력을 다루는 매개체로서 파일과 관련된 정보를 담고있는 FILE 구조체를 가리키고 있다.
이 구조체가 실제로 파일과 관련된 정보를 담고 있는지 확인하기 위해 한 바이트씩 읽으면서 IO_read_ptr의 주소값을 확인해 보았다.
위에서 볼 수 있듯이 실제로 IO_read_ptr의 주소값도 1씩 증가함을 확인할 수 있다.
2.1.1 다른 의미의 File Pointer
파일 Stream에서 현재 Byte의 위치를 가리키는 포인터를 의미한다. 그림 2에서의 file pointer이다.
파일의 한 바이트가 읽혔을 때, 이 포인터는 다음 바이트의 위치를 가리킨다. f-version 에서는 ftell을 통해 이 파일 포인터가 어디 위치해 있는지 알 수 있으며, non-f-version 에서는 lseek을 통해 파일 포인터의 위치를 지정함과 동시에 파일 포인터의 위치를 알 수 있다.
2.2 File Descriptor
non-f-version에서 파일을 다루는 매개체로서 특정한 파일에 접근하기 위한 추상적인 키이다(출처)
UNIX에서 stdin은 0, stdout은 1, stderr는 2로 File Descriptor를 지정해 놓았다. 실제로 stdin FILE구조체 포인터의 fileno 변수를 조회해보면 0이 들어가있다.
| tag: | system-programming |
|---|