[C 공부] 5~6강 — 표준 입출력 도구
표준 입출력(I/O) — getchar, putchar 함수
4 min readNov 3, 2019
이 포스트는 널널한 개발자님(최호성 분)의 “독하게 시작하는 C 프로그래밍” 강의를 보며 남긴 글입니다.
(👉 독하게 시작하는 C 프로그래밍 강의)
CLI는 구닥다리가 아니고 근간이다!
HCI(Human-computer interaction)가 많이 발전했다. HCI에는 이런 것들이 있다.
- CLI(DOS, Linux…) — command line interface
- GUI(그래픽 들어간거)
- UX(사용자 경험)
CLI는 구닥다리가 아니고 근간이다! 정보라는 것이 문자열로 존재하보니 CLI 인터페이스는 중요하다. Web을 이루고 있는 HTML, XML, HTTP 등도 정보를 나열할 때 문자열 형태이다.
컴퓨터에 대해 조금 더 이해해보자
컴퓨터는 H/W(하드웨어)와 S/W(소프트웨어)로 이루어져있다. S/W는 시스템소프트웨어와 응용소프트웨어로 나뉘고, 시스템소프트웨어의 대표적인 것이 운영체제이다.
├─── H/W
├─── S/W
├─ 시스템소프트웨어 (ex. 운영체제)
└─ 응용소프트웨어
컴퓨터의 Layer 개념
국가를 구성하는 것을 예시로 생각해보자.
- 국가를 구성하는 것은 영토, 영해, 영공이 있을 수 있다.
- 국가를 구성하려면 정부도 필요하다.
- 사람들도 있어야한다. 개인도 있고, 여럿이 살 수도 있고…
국가를 컴퓨터라고 생각해보면…
- 영토, 영해, 영공은 H/W적인 요소이다.
- 정부는
Kernel(OS를 이루고 있는 코어모듈)
이다. 커널이 입출력(I/O)의 주체이다. C언어에서는 어떤 함수를 가지고 입출력을 한다. 입출력은 절대User 모드
가 하지 않는다. - 사람들이 모인 곳은
User 모드
이다. 하나의 집(그림에서 네모)는 Process이고, 개인(사람)은 Thread라고 이해하면 된다. 집(가정, 그림에서 네모)마다 고유한 영역(메모리)이 있어야하고 침해받으면 안되는데, 그걸 정부(OS)가 관리한다. 그런데 침범할 수 있는 소프트웨어가 있는데,디버거
이다. 디버거는 검찰, 경찰 같은 것인데, 소프트웨어는 프로세스의 고유한 영역(메모리)을 침범할 수 있다. 나쁘게 사용하면 메모리 해킹이고, 좋게 사용하면 문제를 해결하는 도구이다. 디버거를 이용하면 각 프로세스의 메모리를 뒤져볼 수 있다. - 하나의 OS를 두고 여러 프로세스가 있을 수 있다. 이걸
멀티태스킹
이라고 한다. - 한 프로세스에 여러 쓰레드가 있을 수 있다. 이걸
멀티쓰레드
라고 한다. - 위 캡쳐에 있는 모든 Layer는 C언어로 구현할 수 있다.
getchar와 putchar 함수에 대해
- 입출력은 항상
Kernel
이 한다.User 모드
는File(디바이스 파일)
을 통해Kernel
에게 입출력을 요구한다.
pucchar
함수는 User모드에서Kernel
에게 입출력을 요구하는 함수이다.File
에는 2가지의Buffer
(메모리)가 있다. 하나가 Write(입력)를 위한 것이고, 하나는 Read(출력)를 위한 것이다.User 모드
에서Kernel
로puchar('A');
를 한다고 가정하면,'A'
를Buffer
에 채우는 과정(Buffering
이라고 한다)을 하지 않고 바로 Kernel에 전달한다.
getchar
함수는Buffer
에서 한글자를 꺼내오는 함수이다.- 만약
Buffer
에 10글자가 있었다면,getchar
함수를 실행하면 1글자만 퍼올리고,Buffer
에는 9글자가 남게 된다. - 그래서
getchar
는Buffer
를 이용하기 때문에 Buffered I/O를 한다고 말한다. getchar
scanf
gets
라는 함수들은 Buffered I/O를 하는 함수이다.getchar
: buffer에서 한 글자만 꺼내오는 함수scanf
: buffer에서 %d 같은 형식문자에 맞춰서 꺼내오는 함수gets
: buffer에서 한 줄씩 꺼내오는 함수