728x90
write와 printf의 혼용 문제
printf 구현 과정 중, 구현한 printf를 main 함수에서 결과를 확인하는 과정에서 출력 순서가 이상하게 도출되었다.
printf 구현 중에는 write 함수만 사용했기에, printf와 write 함수가 혼용되면서 생긴 문제였다.
뭐가 문제인지 몰라 printf출력 순서 이상하다고 검색 참 많이 했다.
int main()
{
write(1, "1", 1);
printf("23");
write(1, "4", 1);
printf("56");
write(1,"7", 1);
}
출력 결과는 놀랍게도 1472356
으로 나온다.
보이는 것 처럼 write
로 인한 출력결과가 먼저 나오고 printf
의 출력 결과는 나중에 나오게 된다.
이러한 이유는 write
함수는 버퍼에 있는 내용을 그대로 출력하지만, printf
함수는 표준 출력 모드로 동작하여 종료 문자(\n
, \0
)을 만났을 때 내용을 출력하기 때문!
해결 방법 1. fflush
int main()
{
write(1, "1", 1);
printf("23");
fflush(stdout); //printf 이후 버퍼 비우기
write(1, "4", 1);
printf("56");
fflush(stdout); //printf 이후 버퍼 비우기
write(1,"7", 1);
}
다음과 같이 printf 사용후 fflush를 사용해준다.
fflush(stdout)은 버퍼 안에 데이터를 강제로 비운다.
해결 방법 2. setbuf
int main()
{
setbuf(stdout, NULL); //<stdio.h>
write(1, "1", 1);
printf("23");
write(1, "4", 1);
printf("56");
write(1,"7", 1);
}
setbuf
는 스트림 버퍼를 설정하는 함수다.
void setbuf(FILE *fp, char *buf)
//fp는 버퍼를 설정할 파일 포인터
//buf는 버퍼로 사용할 배열 공간 주소
stdout 같은 터미널은 line buffer로 지정되면서 개행문자를 만나야 화면에 출력된다.
buf 인자에 NULL을 넣게되면 none buffer를 의미하며 null이 아닌 값을 넣게 되면 해당 버퍼를 full buffer로 사용하게 된다.
쓰기 작업을 하자마자 바로 출력된다는 말!
📚 참고 서적 및 웹사이트
728x90
'공부 > C\C++' 카테고리의 다른 글
[C/C++] Heap BOF(Buffer OverFlow)란 (0) | 2021.03.31 |
---|---|
[C/C++] char *와 char []의 차이와 bus error (0) | 2021.03.31 |
[C] 가변인자, 가변인자 함수 (0) | 2021.03.18 |
[C/C++] int와 long, unsigned int와 unsigned long의 차이와 혼동으로 인한 문제점 (0) | 2021.03.18 |
[C/C++] 구조체와 연결리스트 (0) | 2021.03.16 |