The IO 구조
The IO 구조
IO 구조는 모든 입출력 구조와 펑터에 공통인 타입과 값을 담아요. 특히 I/O 중 발생하는 오류에 대한 구조적 정보를 제공하는 데 쓰는 Io 예외를 정의해요.
출처: 문서
본문
시놉시스 (Synopsis)
signature IO
structure IO :> IO
인터페이스 (Interface)
exception Io of {
name : string,
function : string,
cause : exn
}
exception BlockingNotSupported
exception NonblockingNotSupported
exception RandomAccessNotSupported
exception ClosedStream
datatype buffer_mode = NO_BUF | LINE_BUF | BLOCK_BUF
설명 (Description)
exception Io of {
name : string,
function : string,
cause : exn
}
I/O 하위 시스템에서 오류가 발생할 때 발생시키는 주 예외예요. Io의 성분은 다음과 같아요.
name
리더 또는 라이터의 이름 성분이에요.
function
예외를 발생시키는 함수의 이름이에요.
cause
리더나 라이터가 발생시키거나 스트림 I/O 수준에서 감지된 밑에 깔린 예외예요. 일반적인 원인 중 일부는: 실제 시스템 호출을 수행해 실패했으면 OS.SysErr, 잘못된 형식 인자가 주어졌으면 Subscript, BlockingNotSupported, NonblockingNotSupported, ClosedStream이에요. Io의 cause 필드는 이 특정 예외들로 제한되지 않아요. 자신의 리더·라이터를 만드는 사용자는 좋아하는 어떤 예외든 발생시킬 수 있고, 결과 Io 예외의 cause 필드로 보고돼요.
exception BlockingNotSupported
밑에 깔린 라이터가 차단 쓰기를 지원하지 않을 때 output, outputSubstr, output1, flushOut I/O 연산에 쓰는 예외이고, 밑에 깔린 리더가 차단 읽기를 지원하지 않을 때 input, inputN, input1 I/O 연산에 쓰는 예외예요. I/O 시스템 내에서 절대 발생시키면 안 되고, 오직 Io 예외의 cause 필드에만 사용해야 해요.
exception NonblockingNotSupported
밑에 깔린 스트림이 비차단 입력을 지원하지 않을 때 canInput I/O 연산이 쓰는 예외예요. I/O 시스템 내에서 절대 발생시키면 안 되고, 오직 Io 예외의 cause 필드에만 사용해야 해요.
exception RandomAccessNotSupported
밑에 깔린 장치가 임의 접근을 지원하지 않음을 나타내기 위해 STREAM_IO 위치 연산이 쓰는 예외예요. I/O 시스템 내에서 절대 발생시키면 안 되고, 오직 Io 예외의 cause 필드에만 사용해야 해요.
exception ClosedStream
밑에 깔린 객체가 닫히거나 종료되었을 때 출력 I/O 연산이 쓰는 예외예요. I/O 시스템 내에서 절대 발생시키면 안 되고, 오직 Io 예외의 cause 필드에만 사용해야 해요.
datatype buffer_mode = NO_BUF | LINE_BUF | BLOCK_BUF
이 값들은 출력 스트림에 사용되는 버퍼링의 종류를 지정해요. 출력 스트림의 모드가 BLOCK_BUF이면 구현은 출력을 버퍼에 저장했다가 버퍼가 가득 찼을 때만 실제로 장치에 써야 해요. NO_BUF이면 어떤 출력 함수의 인자 바이트를 해당 장치에 직접 써야 해요. LINE_BUF이면 줄바꿈 문자("#\n")가 보일 때까지 출력 바이트를 버퍼에 넣고, 그 시점에 줄바꿈 문자를 포함해 버퍼를 플러시해야 해요. 이진 스트림에서는 LINE_BUF 모드를 BLOCK_BUF의 동의어로 취급해야 해요. 구현 참고: 출력 버퍼링은 비용이 큰 연산일 수 있는 밑에 깔린 장치로의 쓰기 횟수를 줄이기 위한 효율성 제공이다. I/O 하위 시스템은 출력 장치에 따라 초기 버퍼 모드를 선택해야 하며 기본적으로 출력은 버퍼링돼야 해요. 최적 버퍼 크기는 밑에 깔린 라이터 값의 chunkSize 필드가 지정해요. TextIO.stdErr로의 출력은 버퍼링하지 않아야 하고, 터미널류 장치로의 출력은 라인 버퍼링해야 해요.
OS.IO.kind iod = OS.IO.Kind.tty