일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- up-casting
- 2019년 회고
- 무래함의 비용
- down-casting
- 다운캐스팅
- 리눅스 setvbuf
- 임베디드 시스템 프로그래밍
- 업캐스팅
- c언어 setvbuf
- 임베디드 입문
- 데커 알고리즘
- peterson 알고리즘
- 데커
- AVR기초
- 피터슨 알고리즘
- 임베디드 초급
- 임계 영역
- 임베디드 개발자
- 코딩
- 리눅스 기초
- 임베디드시스템프로그래밍
- 데커 알고리듬
- Dekker
- AVR
- 아두이노
- 임베디드
- 외부인터럽트
- 워치독 타이머
- setvbuf
- 대구소프트웨어고등학교
- Today
- Total
인성 좋은 인성이
Linux - setvbuf() 함수 본문

fputc(), putchar()
위 코드를 실행시키면, 실행결과는 2,3,4,5 newline 6,7,8,9,0 (으)로 나올 것이라 생각할 수도 있다.
하지만 실제로 실행을 시키면 2,4,3,5 newline 6,8,0,7,9 (으)로 나온다. 왜 일까?
이미 눈치를 챘을 수도 있지만 코드를 보면 출력하는 함수가 두 종류이다. putchar와 fputc를 사용한다.
그렇다면 이 친구들의 역할이 어떻기에 이런 결과가 나올까?
putchar와 fputc는 표준 출력 함수이다. 이 둘의 차이점은 fputc는 파일로 출력한다는 것이고, putchar는 화면으로 출력한다. 자세히 살펴보면 putchar의 인자 값은 int c가 들어가고 fputc의 인자 값은 int ch, FILE *fp로 두 가지가 들어간다.
그렇다면 코드를 살펴보자. fputc는 인자 값으로 '8'과 stderr를 넣었다. 여기서 stderr는 표준 오류 출력이다. 따라서 컴파일러가 읽은 후 바로 화면에 바로 나오게 된다. 왜 먼저 나오는지 이해가 안 된다면 쉽게 생각해보자 상식적으로 ''오류가 발생했습니다"라는 메시지는 오류 발생 시점에서 나와야 한다. 그래야 사용자가 오류가 났다는 것을 인지할 수 있을 것이다. stderr는 그런 오류 메시지를 보여주는 것이기 때문에 바로 출력되는 것이다.
putchar는 인자 값으로 정수를 넣었다. 우선 이 친구들이 늦게 나온 이유를 알아보자. 그 이유로는 하드웨어의 자원은 한정적이다. 즉 우리가 무리하게 입출력을 하려고 하면 과부하가 걸리기 마련이다. 그래서 과부하를 방지하기 위해서 입출력하는 것들을 버퍼에 저장을 했다가 한 번에 출력하는 것이다. 따라서 putchar 했던 것이 빨리 나오지 않은 것은 버퍼에 저장되었었기 때문이다. 그렇다면 어느 시점에서 출력을 할까?
기본적으로는 개행 문자를 만났을 때 출력한다. 그리고 프로그램이 종료되었다는 신호가 들어와도 출력한다.
setvbuf()
개발을 할 때 때로는 버퍼를 직접 설정해야 할 때가 온다. 그때 사용하는 함수가 setvbuf() 함수이다. 이 함수는 버퍼링 시스템을 변경한다.

함수 원형이다. 4가지의 인자 값이 들어감을 알 수 있다.
setvbuf() -> 버퍼링 시스템 변경 함수.
함수 원형
setvbuf(FILE *fstream, char *buf, int mode, size_t si
ze);
- *fstream : 파일의 주소를 가지고 있는 친구다. 0,1,2번은 지정되어 있다. (0 : 표준 입력, 1 : 표준 출력, 2 : 표준 에러 출력)
- *buf : 저장할 버퍼를 지정한다.
- mode : 어떤 모드를 사용할 것인지 정하는 곳이다. 모드는 3가지가 있으며 각각 _IONBF(널 버퍼) _IOLBF(라인 버퍼) _IOFBF(풀 버퍼)이다.

위 코드에서 arr라는 버퍼를 잡아줬고, 주석 처리돼있는 부분에 arr를 넣어줬다. 이렇게 버퍼를 직접 설정할 수 있다.