티스토리 뷰

입출력이 어떻게 되는지?

User에는 집(Process)이 있고 그 안에 사는 사람들(Thread)가 있으며,

남에 집에 침범 할 수 있는 일종의 경찰/검사들(Debugger)가 존재한다.

Kernel은 정부(구성요소)라고 가정하며, H/W는 영토, 영해, 영공이라고 가정하자.

 

입출력 같은 경우는 User에서 발생하지 않고,

Kernel에서 발생한다.

 

User 모드 어플리케이션은 Kernel의 요소에 접근하는 것 뿐이다.

그리고 접근하기 위해 kernel의 추상화된 인터페이스인 file을 놓아준다.

 

File은 Buffer(Memory)를 가지고 있는데, 하나는 Write 용 또 하나는 Read 용이라고 가정.

 

getchar()는 buffer로부터 한글자를 퍼올린다.

scanf()는 형식문자에 맞게 꺼내온다.

gets()는 한줄

 

위에 얘들을 buffered I/O를 하는 얘들이라고 부른다고 한다.

 

또한 buffering 이란?

유튜브 스트리밍을 예로 들면,

 

PC ------Read-------> YouTube

   <-------------------

 

buffer라는 것을 두고 buffer를 어느정도 채워지면 play를 하고 나머지에 자료를 계속 채워넣는다.

하지만, 네크워크가 불안정하게 되면 play를 꾸준하게 정보를 소비하므로, 그때 buffering이 발생하게 되는것이다.

평소에는, buffer를 채워넣는것이 play보다 많기 때문에 그렇게 안 보이는 것이다.

 

c언어 형식 문자

 

getchar(), gets(), scanf() 세 함수 모두 사용자의 키보드 입력 완료를 위해 <enter> 키를 입력합니다.

따라서, 이러한 함수의 형식 문잘열에 개행문자('\n')를 포함하는 것은 매우 잘못된 것입니다.

 

왜냐하면, 입력 완료를 의미하는 개행과 형식 문자가 요구하는 개행문자를 구별할 수 없기 때문입니다.

 

scanf("%d%d", &x, &y);

scanf()와 같은 함수의 경우는 같은 형식 문자가 연이어 붙어 있으면,

빈칸, Tab 키, Enter 키(개행문자) 입력으로 각 형식 문자에 대한 입력을 구별합니다.

 

scanf() 함수를 자주사용하다보면, fflush(stdin); 함수를 볼 수 있습니다.

이 함수는 입력버퍼를 비워주는 함수입니다. 하지만 fflush(stdin) 함수는 위험성을 지닙니다.

 

 

fflush함수는 함수의 인자에 해당하는 출력버퍼를 비우는 역할을 합니다. 따라서 fflush( stdin )과 같이 입력버퍼를 fflush의 인자로 전달할수 없습니다.

 

예외적으로 Visual Studio에서는 이 방법을 허용하고 있지만 다른 컴파일러에서는 사용할 수 없고, 입력버퍼가 비워진다 할지라도 그 결과를 예측할 수 없습니다. 그러므로 fflush 함수는 fflush( stdout ) 처럼 출력버퍼를 비우는 용도로만 사용해야 하지 fflush( stdin )처럼 입력버퍼를 인자로 전달하는 형태로 사용해선 절대 안됩니다. 

 

참고로 fflush가 출력버퍼를 비운다는 뜻은 버퍼에 있는 데이터를 그냥 지워버리는것이 아니라 버퍼에 있는 데이터를 파일이나, 모니터 등 출력하고자 하는 목적지로 전송하는것을 뜻합니다

 

대안으로는 getchar()함수를 뽑을 수 있다. 버퍼에서 하나씩 꺼내는 함수의 특성으로 '\n'(개행문자)가 나올때까지 반복함으로써 버퍼를 비울 수 있다.

 

while( getchar() != '\n' );

 

다른 개발 환경과의 호환성을 고려한다면, fflush 함수보다는 위의 예시처럼 입력함수를 이용해 버퍼를 비워주는것이 좋은 프로그래밍 습관이라 할 수 있습니다.

  

출처: https://mjson.tistory.com/190 [MJay]

fflush함수에 대한 자세한 내용은 위 블로그로..

'언어 > C' 카테고리의 다른 글

[Inflearn C] 연산자  (0) 2019.09.05
[Inflearn C] Type Promotion 형승격  (0) 2019.09.05
[Inflearn C] 실수형 float, double - 자료형  (0) 2019.05.29
[Inflearn C] signed, unsigned - C 자료형  (0) 2019.05.28
[Inflearn] C강의 1번째 정리  (0) 2019.05.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함