본문 바로가기
지식창고/IT 지식

stderr 과 stdout 의 차이. 표준입출력의 버퍼

by eteo 2022. 12. 14.

 

  • 표준입력(STDIN): 표준 입력 장치의 ID 는 숫자로는 0 이며 일반적으로는 키보드가 된다.
  • 표준출력(STDOUT):  출력을 위한 스트림으로 표준 출력 장치의 ID 는 1이며 일반적으로는 현재 쉘을 실행한 콘솔(console)이나 터미널(terminal)이 된다.
  • 표준에러(STDERR):  에러를 위한 스트림으로 표준 에러 장치의 ID 는 2이며 일반적으로는 표준 출력과 동일하다.

 

 

 

 

 

 

strerr(표준에러) 와 stdout(표준출력)은 둘 다 콘솔 화면에 출력한다는 점에서 동일하지만 둘의 차이점의 버퍼링 방식이다.

 

strerr 는 Null buffering 방식으로 버퍼링 없이 바로 출력이 되지만 stdout 은 line buffering 방식으로 개행문자가 들어와야 출력이 되는 것이다.

 

 

#include <stdio.h>

int main()
{
    char str1[] = "test1";
    char str2[] = "test2";
    
    printf("%s", str1);
    fprintf(stderr, "%s\n", str2);
    printf("%s\n", str1);

    return 0;
}

 

 

위의 예시에서 stderr 가 먼저 출력이 되고 stdout 은 개행문자를 만나자 그제야 버퍼에 들어있던 것이 출력되는 것을 볼 수 있다.

 

 

 

 

 

이처럼 표준입력/표준출력 함수들은 임시 메모리 공간인 buffer 를 사용하므로 함수 호출시 바로 입출력이 일어나는 것이 아니다.

 

출처 :&nbsp;http://www.tcpschool.com/c/c_io_console

 

 

고속의 CPU와 저속의 주변 장치 사이의 속도 차이 때문에 CPU가 I/O검사에 종속되지 않도록 하기위해 이러한 임시 기억장소를 사용하며, CPU가 다른 작업을 하는 동안 일반적으로 buffer에 개행문자가 들어오거나 꽉 차게 되면 OS는 CPU에게 알리고 그때서야 입출력이 일어난다. 

 

 

 

즉,

 

printf() : 호출하는 순간 바로 모니터로 출력되는 것이 아니라 stdout으로 보내지며, 개행문자를 만나거나 fflush(stdout) 함수로 버퍼를 비우거나, 또는 프로그램이 정상 종료되면 모니터로 출력한다.

 

scanf() : 키보드로 타이핑하는 순간 buffer에 입력되고 모니터로도 볼 수 있지만, 최종적으로 개행문자가 입력되야 stdin으로부터 데이터를 읽어와 변수에 저장한다.

 

 

getchar() : 현재 buffer에 쌓인 문자 개수와 상관없이 한 문자만 buffer에서 읽어간다. 따라서 buffer에 문자가 그대로 남아있게 되면 다음번에 표준입력 함수를 호출했을 때 타이핑을 안했음에도 불구하고 buffer에 있는 값을 읽어가는 일이 발생하게 된다.

 

 

https://eteo.tistory.com/33

 

scanf , scanf_s " %d "로 정수 입력 받으려다 문자(열)이 잘못 들어왔을 때 무한루프에 빠지는 문제 /

사용자가 꼭 우리가 기대한대로 입력하라는 법이 없으니 이러한 예외처리도 필요하다. scanf, scanf_s %d로 정수 입력 받으려다 문자나 문자열이 들어왔을 때 무한루프에 빠지는 문제 혹은 다음 문

eteo.tistory.com

 

버퍼 방식

버퍼 방식 설명
Full buffer 버퍼가 가득 차야 파일에 읽고 쓰는 방식으로 주로 일반 파일에 적용
Line buffer 버퍼에 개행 문자가 들어오면 파일에 읽고 쓰는 방식으로 표준 입출력 파일에 쓰임
None buffer 버퍼를 사용하지 않고 바로바로 파일에 읽고 쓰는 방식으로 표준 에러 파일에 쓰임

 

 

 

참고 :

https://bubble-dev.tistory.com/entry/CC-setbuf3-setvbuf3

https://lopicit.tistory.com/201

http://www.tcpschool.com/c/c_io_console

https://www.lesstif.com/lpt/stdin-stdout-stderr-113346293.html

'지식창고 > IT 지식' 카테고리의 다른 글

ANSI, 유니코드 인코딩  (0) 2023.02.19
[UML] 시퀀스 다이어그램 (Sequence Diagram)  (0) 2023.01.27
정규표현식  (0) 2022.12.11
ping 명령어 옵션, tracert 명령어  (0) 2022.10.26
x86-64 어셈블리어  (0) 2022.10.20