- 표준입력(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 를 사용하므로 함수 호출시 바로 입출력이 일어나는 것이 아니다.
고속의 CPU와 저속의 주변 장치 사이의 속도 차이 때문에 CPU가 I/O검사에 종속되지 않도록 하기위해 이러한 임시 기억장소를 사용하며, CPU가 다른 작업을 하는 동안 일반적으로 buffer에 개행문자가 들어오거나 꽉 차게 되면 OS는 CPU에게 알리고 그때서야 입출력이 일어난다.
즉,
printf() : 호출하는 순간 바로 모니터로 출력되는 것이 아니라 stdout으로 보내지며, 개행문자를 만나거나 fflush(stdout) 함수로 버퍼를 비우거나, 또는 프로그램이 정상 종료되면 모니터로 출력한다.
scanf() : 키보드로 타이핑하는 순간 buffer에 입력되고 모니터로도 볼 수 있지만, 최종적으로 개행문자가 입력되야 stdin으로부터 데이터를 읽어와 변수에 저장한다.
getchar() : 현재 buffer에 쌓인 문자 개수와 상관없이 한 문자만 buffer에서 읽어간다. 따라서 buffer에 문자가 그대로 남아있게 되면 다음번에 표준입력 함수를 호출했을 때 타이핑을 안했음에도 불구하고 buffer에 있는 값을 읽어가는 일이 발생하게 된다.
버퍼 방식
버퍼 방식 | 설명 |
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 |