puts — 채널에 문자열 쓰기

puts — 채널에 문자열 쓰기

프로그램이 결과를 화면에 띄울 때면 어김없이 등장하는 명령이 바로 puts예요. Tcl에서 무언가를 출력해야 한다면 거의 대부분 이 명령이 담당하게 돼요. 운이 좋게도 사용법이 아주 단순해서, 콘솔에 한 줄 찍어 보는 것부터 파일에 로그를 남기는 것까지 같은 방식으로 확장할 수 있어요.

출처: 문서

본문

문법

puts ?-nonewline? ?channelId? string

동작 방식

putsstring에 담긴 문자들을 channelId가 가리키는 채널에 써요. channelId는 열려 있는 채널의 식별자여야 하는데, Tcl 표준 채널(stdout, stderr), open이나 socket의 반환값, 또는 Tcl 확장이 만들어 준 채널 생성 명령의 결과가 올 수 있어요. 당연히 출력용으로 열려 있어야 하고요.

channelId를 생략하면 기본값은 stdout이에요. 그리고 puts는 보통 string 뒤에 개행 문자를 자동으로 붙여 주는데, -nonewline 스위치를 지정하면 이 동작을 끌 수 있어요.

출력 안의 개행 문자는 채널의 -translation 옵션 값에 따라 플랫폼별 줄바꿈 시퀀스로 번역돼요. 예를 들어 PC에서는 개행이 보통 캐리지리턴+라인피드(\r\n) 시퀀스로 바뀌죠. fconfigure가 출력을 어떻게 바꾸는지에 대한 자세한 내용은 fconfigure 매뉴얼을 참고하면 좋아요.

버퍼링과 비동기 출력

Tcl은 출력을 내부적으로 버퍼링해요. 그래서 puts로 쓴 문자들이 파일이나 장치에 즉시 나타나지 않을 수 있어요. 버퍼가 차거나 채널이 닫힐 때까지 출력을 미루는 게 일반적이죠. 즉시 나타나게 하고 싶다면 flush 명령으로 강제로 밀어내면 돼요.

출력 버퍼가 가득 차면 puts는 버퍼된 데이터가 운영체제에 모두 받아들여질 때까지 보통 블로킹돼요. 그런데 channelId가 논블로킹 모드라면, 운영체제가 데이터를 받아들일 수 없어도 puts는 블로킹하지 않아요. 대신 Tcl은 데이터를 계속 버퍼링해 두고, 밑에 있는 파일이나 장치가 받아들일 수 있는 속도만큼 백그라운드에서 써 내려가요. 다만 논블로킹 출력이 제대로 동작하려면 애플리케이션이 Tcl 이벤트 루프를 돌려야 해요. 그렇지 않으면 Tcl은 파일이나 장치가 더 많은 출력을 받을 준비가 됐다는 사실을 결코 알지 못하거든요.

논블로킹 모드에서는 채널에 임의로 많은 양의 데이터가 버퍼링될 수 있어서 메모리를 많이 잡아먹을 위험이 있어요. 메모리 낭비를 피하려면 논블로킹 I/O는 보통 fileevent 명령과 함께 이벤트 주도 방식으로 사용하는 게 좋아요. 즉, 파일 이벤트를 통해 채널이 더 많은 출력을 받을 준비가 됐다는 통지를 최근에 받지 않았다면 puts를 호출하지 마세요.

예제

콘솔(또는 stdout이 향하는 곳)에 짧은 메시지를 쓰기:

puts "Hello, World!"

여러 부분으로 나눠 메시지 출력하기:

puts -nonewline "Hello, "
puts "World!"

표준 에러 채널에 메시지 출력하기:

puts stderr "Hello, World!"

파일에 로그 메시지 추가하기:

set chan [open my.log a]
set timestamp [clock format [clock seconds]]
puts $chan "$timestamp - Hello, World!"
close $chan

더 알아보기

  • file: 파일을 열고 닫고 다루는 명령
  • fileevent: 채널의 읽기/쓰기 가능 이벤트 처리
  • Tcl_StandardChannels: Tcl의 표준 채널 개념