(C언어) printf() 함수 성능 및 예외 상황에서 출력 이해하기

2024. 1. 4. 17:59코딩세상/C-언어

프로그램 코딩에 있어 정보를 출력할 수 있다는 것이 얼마나 큰 축복인지 처음에는 이해할 수 없을 것이다.

특히 embeded 시스템이나 kernel 부분 작업을 하다 보면 깜깜한 밤에 한줄기의 빛이 출력되어 나오는 메시지를 보는 것일 것이다.

 

printf로의 출력을 이해 하면 좀 더 디버깅하는데 도움이 될 것이다.

 

일반 OS가 있는 시스템에서 printf 출력은 실시간성을 보장해 주지 못한다는 것을 기억하자.

보통 출바꿈 문자인 "\n"을 만나면 저장되어 있는 buffer를 바로 출력해 주지만, 개행 문자가 없다면 출력이 다소 지연이 될 수 있다.

 

Hello World를 출력하는 함수인데 개행 문자가 없다.

출력 지연이 생기다는 것이다.

 

지금은 다른 예외가 없어 개행문자가 없이도 정상적으로 출력이 되었다.

 

이제 간단하게 예외를 만들어 보자.

일반 프로그램이 접근할 수 없는 address에 값을 write 하여 Segmentation fault를 만드는 코드를 추가하자.

 

0번지에 값을 write 하는 프로그램이다.

 

Hello World 출력이 없이 예외가 발생을 해 버렸다.

 

예외가 발생하는 경우의 화면 출력으로 원하는 부분을 찾아 가려면 stderr를 이용하여야 한다.

process가 생성이 되면 file descript 3개가 할당이 되는데, stdin, stdout, stderr이다.

 

printf는 stdout에 출력하는 것으로 성능을 위하여 buffering이 추가되어 있는 출력 함수이다.

 

stderr로 출력 할 경우 buffering이 없이 바로 출력이 보장이 된다. 단 성능 저하를 감수해야 하기 때문에 error의 경우 꼭 출력이 보장되어야 하는 루틴에서만 사용하여야 한다.

 

stderr로 출력 하도록 수정하였다.

 

원하는 부분까지 정상적으로 출력이 된다.

 

디버깅을 하다 보면 가끔 printf 출력 내용만 보고 예외 발생한 지점을 오해하는 경우가 많이 발생을 하는데, 결론은 printf로는 정확한 위치를 알 수 없다는 것만 이해하자.