포트
포트 (Ports)
포트는 바이트를 만들어 내거나 소비하는 객체예요. 입력 포트는 바이트를 만들고 출력 포트는 바이트를 소비하며, 입력과 출력을 겸하는 포트도 있어요. 파일이나 네트워크 연결 같은 시스템 자원과 연결된 포트는 명시적으로 닫아줘야 해요.
출처: Racket Reference
본문
13.1 포트
포트는 바이트를 만들어 내고/소비해요. 입력 포트는 바이트를 만들어 내고, 출력 포트는 바이트를 소비해요(입력 포트이면서 출력 포트인 포트도 있어요). 입력 포트가 문자 기반 연산에 제공되면 바이트가 문자로 디코딩되고, 문자 기반 출력 연산도 마찬가지로 문자를 바이트로 인코딩해요(인코딩과 로케일(Encodings and Locales) 참고). 바이트와 바이트로 인코딩된 문자 외에도, 일부 포트는 특수 결과로 임의의 값을 만들어 내거나 소비할 수 있어요.
포트가 파일, 네트워크 연결, 또는 그 밖의 시스템 자원에 해당하면, 낮은 수준 자원을 해제하기 위해 close-input-port나 close-output-port(또는 간접적으로 custodian-shutdown-all)로 명시적으로 닫아야 해요. 어떤 종류의 포트든 닫힌 뒤에는 그 포트에서 읽거나 쓰려고 하면 exn:fail 예외가 발생해요.
입력 포트가 만들어 내는 데이터는 읽거나(peek 아님) 훑어볼(peek) 수 있어요. 데이터를 읽으면 그 데이터는 소비된 것으로 간주되어 포트의 스트림에서 제거돼요. 데이터를 훑어보면 (peek) 그 데이터는 포트의 스트림에 남아 다음 읽기나 훑어보기에서 다시 반환돼요. 이전에 훑어본 데이터는 커밋(commit)될 수 있는데, 이는 동기화 가능한 이벤트를 통한 다른 훑어보기/읽기 시도와 함께 동기화될 수 있는 방식으로, 그 데이터를 읽기에서처럼 포트에서 제거하는 것을 의미해요. 읽기와 훑어보기 연산은 보통 블로킹 방식이에요. 즉, 포트에서 데이터를 얻을 수 있을 때까지 읽기나 훑어보기 연산이 완료되지 않아요. 읽기와 훑어보기의 논블로킹 변형도 사용 가능해요.
전역 변수 eof는 파일 끝(end-of-file) 값에 바인딩되고, eof-object?는 이 값에 적용될 때만 #t를 반환해요. 포트에 더 이상 데이터가 없으면 포트에서 읽으면 파일 끝 결과가 산출되지만, 일부 포트는 스트림 중간에서도 파일 끝을 반환할 수 있어요. 예를 들어 유닉스 터미널에 연결된 포트는 사용자가 control-D를 입력하면 파일 끝을 반환하는데, 사용자가 입력을 더 주면 포트는 파일 끝 이후에도 추가 바이트를 반환해요.
모든 포트에는 object-name으로 보고되는 이름이 있어요. 이름은 어떤 값이든 될 수 있으며, 주로 오류 보고 목적으로 사용돼요. read-syntax 프로시저는 입력 포트의 이름을, 만들어 내는 문법 객체의 기본 소스 위치로 사용해요.
포트는 동기화 가능한 이벤트로 사용될 수 있어요. 입력 포트는 read-byte가 블로킹되지 않을 때 동기화할 준비가 된 것이고, 출력 포트는 write-bytes-avail이 블로킹되지 않을 때 또는 포트에 버퍼링된 문자가 있고 write-bytes-avail*가 버퍼의 일부를 플러시할 수 있을 때(비록 write-bytes-avail은 블로킹될 수 있지만) 동기화할 준비가 된 것이에요. 입력 포트이면서 출력 포트인 값은 동기화 가능한 이벤트로는 입력 포트처럼 동작해요. 포트의 동기화 결과는 포트 자신이에요.
- 13.1.1 인코딩과 로케일 (Encodings and Locales)
- 13.1.2 포트 관리 (Managing Ports)
- 13.1.3 포트 버퍼와 위치 (Port Buffers and Positions)
- 13.1.4 위치, 행, 열 세기 (Counting Positions, Lines, and Columns)
- 13.1.5 파일 포트 (File Ports)
- 13.1.6 문자열 포트 (String Ports)
- 13.1.7 파이프 (Pipes)
- 13.1.8 구조체를 포트로 사용하기 (Structures as Ports)
- 13.1.9 커스텀 포트 (Custom Ports)
- 13.1.10 더 많은 포트 생성자, 프로시저, 이벤트
- 13.1.10.1 포트 문자열 및 리스트 변환 (Port String and List Conversions)
- 13.1.10.2 포트 생성 (Creating Ports)
- 13.1.10.3 포트 이벤트 (Port Events)
- 13.1.10.4 스트림 복사 (Copying Streams)