printf 종류의 함수와 putchar 종류의 함수의 차이
글쓴이: 잠수오리배 / 작성시간: 일, 2006/01/15 - 2:13오전
Beginning Linux Programming 의 터미널 파트를 보고 있습니다.
setupterm() 함수로부터 시작하는 터미널 출력을 공부하고 있는데요,
tigetstr()로 넘겨받은 터미널 이스케이프 시퀀스를 tparm()으로 매개변수를 수정하여 다시 출력해보는 실습을 하다가 궁금한게 생겼습니다!!
tparm()을 사용하여 터미널 이스케이프 시퀀스를 터미널에 전송하는데, printf를 사용하면 안되고 putp, tputs를 사용하라고 책에서 일러주네요. 터미널이 연산을 완료하는 동안 필요한만큼 적절히 지연시킬 수 있어야 한다고...
putp나 tputs는 putchar를 랩핑하고 있는거 같은데..
printf와 putchar는 내부적으로 어떤 다른 점이 있는건가요?
사실 특정 좌표로의 커서 이동(cup)나 화면 클리어(ed)와 같은 터미널 이스케이프 시퀀스를 printf를 통해 터미널로 전송해봤는데, putchar와 다를바 없이 잘 실행되었습니다.
책에서는 printf함수로 전송하지 말라고 딱, 마침표를 찍어놨는데, 어떤 이유에서인지 궁금합니다.
하하하 :roll: 이런 기본도 안되어 있는데 자꾸 엉뚱하게 진도만 나가고 있는듯하여 부끄럽네요.
Forums:
printf는 putchar와 달리 library에서 내부적인 buffe
printf는 putchar와 달리 library에서 내부적인 buffering을 합니다.
그래서 flush를 강제로 하거나 혹은 "\n"을 만나게 되면 실제로 OS system call을 보내는 등을 일을 합니다..
putchar는 바로 보냅니다..
그렇게 알고 있습니다.
저도 그렇게만 알고 있었는데..저자가 printf를 사용하지 말라
저도 그렇게만 알고 있었는데..
저자가 printf를 사용하지 말라고 한것은 무슨 의도 때문인지 아십니까?
[quote]printf와 putchar는 내부적으로 어떤 다른 점이
버퍼링과 관련해서, putchar나 printf나 크게 다를바가 없습니다. putchar도 마찬가지로 buffering합니다.
생각하기에 따라 다르지만, 제 기준으로는 wrapping이 아닙니다. 터미널 제어에 필요한 연산을 수행하고, 출력할 일이 있을 경우 putchar를 쓴다는 것입니다.
간단히 생각하기에 printf()는 터미널과 아무런 상관이 없는 함수입니다. 따라서 terminal 제어를 위해 printf()를 직접 쓰는 것은 꺼림직하다는 것을 눈치채셨을 겁니다.
실제로는 터미널 제어에 필요한 delay등의 기능이, printf로는 처리할 수 없기 때문입니다. 올바른 tputs을 써서만이 정확한 제어를 할 수 있습니다. 더 자세한 내용은 terminfo(5) man page와, ncurses manual, ncurses 소스의 ncurses/tinfo/lib_tputs.c를 보기 바랍니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기