표준 I/O
장치 드라이버 내의 버퍼링은 문제 중 일부만 해결해준다.
사용자 프로그램에도 비슷한 문제가 있다.
장치 드라이버가 입력을 버퍼링해도 사용자 프로그램이 사용자가 문자를 입력할 때마다
시스템 콜을 호출하면 장치 드라이버 쪽 입력 버퍼가 아무 쓸모가 없다.
마찬가지로 사용자 프로그램이 문자를 기록하기 위해
매번 시스템 콜을 호출하면 장치 드라이버에 출력 버퍼가 아무 역힐도 못한다.
이런 상황이 자주 있기 때문에 표준 입출력 라이브러리 ( stdio ) 가 만들어졌다.
표준 입출력 라이브러리에는 사용자 프로그램이 쓸 수 있는 버퍼 I/O 함수가 들어 있다.
stdio 라이브러리는 버퍼 입력을 지원한다.
버퍼 입력을 사용하면 시스템 콜을 한번만 사용해 장치 드라이버에서 읽은 데이터를 버퍼에 넣을 수 있다.
사용자 프로그램은 버퍼가 빌 때까지 버퍼에서 입력 문자를 얻는다.
버퍼가 소진되면 다시 시스템 콜을 통해 입력을 더 가져온다.
출력하는 경우에는 버퍼가 꽉 차거나 중요한 문자가 출력될 때까지 문자가 버퍼에 들어간다.
입출력을 효율적으로 하기 위해 아주 많은 일을 하는거 같아 보이지만 이게 끝이 아니다.
어떻게 사용자 프로그램을 터미널 장치 드라이버와 연결할 수 있을까 ?
누군가를 가르킬 때는 그 대상의 모든 특성을 완전히 기술하는 것보다 이름을 사용해 가리키면 편하다.
운영체제도 비슷한 접근 방식을 사용한다.
open 시스템 콜은 파일 이름을 파일을 참조할 수 있는 핸들 이나 파일 디스크립터로 바꿔준다.
이 핸들은 close 시스템 콜로 닫으면 더 이상 핸들을 사용할 수 없다.
핸들은 마치 공연이나 박물관에 들어가면서 가방을 맡기고 받는 보관증과 비슷하다.
stdio 라이브러리는 open 및 close 와 대응되는 fopen 과 fclose 라는 함수를 제공한다.
이 두 함수는 open 과 close 시스템 콜을 사용하되,
파일을 열어서 핸들을 얻을 때 버퍼를 설정하고
파일 핸들을 닫을 때 버퍼를 해제해준다.
유닉스는 장치를 파일처럼 추상화 해주므로 /dev/tty 등의 특별한 파일을 열면 터미널 장치에 접근할 수 있다.
'TEAM STUDY > 한 권으로 읽는 컴퓨터 구조와 프로그래밍' 카테고리의 다른 글
직렬화 ( Serializable ) 란 ? (0) | 2022.01.17 |
---|---|
런타임 라이브러리와 표준 입출력 (0) | 2022.01.07 |
context switch (문맥교환) 이란 ? (0) | 2022.01.03 |
저수준 언어와 고수준 언어 (0) | 2022.01.03 |
이제는 '컴파일과 인터프리터' 모르면 안됨 🔊 (3) | 2021.12.30 |