The Posix.IO 구조
The Posix.IO 구조
POSIX I/O 인터페이스를 제공하는 구조예요. 파일 기술자(descriptor)와 관련 함수를 담아요.
출처: 문서
본문
시놉시스 (Synopsis)
signature POSIX_IO
structure IO : POSIX_IO
인터페이스 (Interface)
eqtype file_desc
eqtype pid
val pipe : unit -> {infd : file_desc, outfd : file_desc}
val dup : file_desc -> file_desc
val dup2 : {old : file_desc, new : file_desc} -> unit
val close : file_desc -> unit
val readVec : file_desc * int -> Word8Vector.vector
val readArr : file_desc * Word8ArraySlice.slice -> int
val writeVec : file_desc * Word8VectorSlice.slice -> int
val writeArr : file_desc * Word8ArraySlice.slice -> int
datatype whence
= SEEK_SET
| SEEK_CUR
| SEEK_END
structure FD : sig
include BIT_FLAGS
val cloexec : flags
end
structure O : sig
include BIT_FLAGS
val append : flags
val nonblock : flags
val sync : flags
end
datatype open_mode
= O_RDONLY
| O_WRONLY
| O_RDWR
val dupfd : {old : file_desc, base : file_desc}
-> file_desc
val getfd : file_desc -> FD.flags
val setfd : file_desc * FD.flags -> unit
val getfl : file_desc -> O.flags * open_mode
val setfl : file_desc * O.flags -> unit
val lseek : file_desc * Position.int * whence
-> Position.int
val fsync : file_desc -> unit
datatype lock_type
= F_RDLCK
| F_WRLCK
| F_UNLCK
structure FLock : sig
type flock
val flock : {
ltype : lock_type,
whence : whence,
start : Position.int,
len : Position.int,
pid : pid option
} -> flock
val ltype : flock -> lock_type
val whence : flock -> whence
val start : flock -> Position.int
val len : flock -> Position.int
val pid : flock -> pid option
end
val getlk : file_desc * FLock.flock -> FLock.flock
val setlk : file_desc * FLock.flock -> FLock.flock
val setlkw : file_desc * FLock.flock -> FLock.flock
val mkBinReader : {
fd : file_desc,
name : string,
initBlkMode : bool
} -> BinPrimIO.reader
val mkTextReader : {
fd : file_desc,
name : string,
initBlkMode : bool
} -> TextPrimIO.reader
val mkBinWriter : {
fd : file_desc,
name : string,
appendMode : bool,
initBlkMode : bool,
chunkSize : int
} -> BinPrimIO.writer
val mkTextWriter : {
fd : file_desc,
name : string,
appendMode : bool,
initBlkMode : bool,
chunkSize : int
} -> TextPrimIO.writer
설명 (Description)
eqtype file_desc
파일 기술자 타입이에요. 표준 입출력·오류 기술자는 각각 stdin, stdout, stderr예요.
eqtype pid
read·write는 파일 기술자에서 읽고 써요.
val pipe : unit -> {infd : file_desc, outfd : file_desc}
dup·dup2는 기술자를 복제하고 close는 닫아요.
dup fd
fd와 같은 열린 파일, 같은 파일 포인터와 접근 모드를 가리키는 새 파일 디스크립터를 돌려줘요. 반환된 파일 디스크립터의 기본 워드(Posix.FileSys.fdToWord 참조)는 이용 가능한 가장 낮은 값이에요. dupfd {old=fd, base=Posix.FileSys.wordToFD 0w0}과 동등해요.
dup2 {old, new}
열린 파일 디스크립터 old를 파일 디스크립터 new로 복제해요.
close fd
파일 디스크립터 fd를 닫아요.
readVec (fd, n)
fd가 가리키는 파일에서 최대 n바이트를 읽어요. 결과 벡터의 크기는 성공적으로 읽힌 바이트 수이며 n보다 작을 수 있어요. 이 함수는 스트림 끝이 감지되면(또는 n이 0이면) 빈 벡터를 돌려줘요. n < 0이면 Size 예외를 발생시켜요.
readArr (fd, slice)
fd가 지정한 파일에서 배열 슬라이스 slice로 바이트를 읽고 실제로 읽은 바이트 수를 돌려줘요. 파일 끝 조건은 0을 반환함으로써 표시되지만, 슬라이스가 비어 있으면 0도 반환돼요. 이 함수는 기본 시스템 호출에 문제가 있으면(예: 파일이 닫혀 있으면) OS.SysErr를 발생시켜요.
writeVec (fd, slice)
writeArr (fd, slice)
이 함수들은 벡터 또는 배열 슬라이스 slice의 바이트를 열린 파일 fd에 써요. 두 함수 모두 실제로 쓰인 바이트 수를 돌려주고, 기본 시스템 호출에 문제가 있으면(예: 파일이 닫혀 있거나 디스크 공간이 부족하면) OS.SysErr를 발생시켜요.
structure FD
val cloexec : flags
설정되면 여는 프로세스가 (exec 등을 통해) 자신을 대체할 때 파일 디스크립터를 닫게 하는 파일 디스크립터 플래그예요. cloexec가 설정되지 않으면 열린 파일 디스크립터는 새 프로세스가 상속해요.
structure O
val append : flags
각 쓰기 전에 파일 오프셋을 파일 끝으로 강제 설정하는 파일 상태 플래그예요.
val nonblock : flags
비차단 I/O를 활성화하는 데 쓰이는 파일 상태 플래그예요.
val sync : flags
``동기화된 I/O 파일 무결성 완료''를 사용한 쓰기를 활성화하는 파일 상태 플래그예요.
datatype open_mode
열린 파일에 허용되는 연산이에요.
= O_RDONLY
읽기 전용으로 파일을 열어요.
| O_WRONLY
쓰기 전용으로 파일을 열어요.
| O_RDWR
읽기와 쓰기용으로 파일을 열어요.
dupfd {old, base}
old에 묶인 새 파일 디스크립터를 돌려줘요. 반환된 디스크립터는 Posix.FileSys.fdToWord와 Posix.FileSys.wordToFD가 정의하는 기본 정수 매핑에 기반해 파일 디스크립터 base보다 크거나 같아요. F_DUPFD 명령을 가진 POSIX fcntl 함수에 해당해요.
getfd fd
fd와 연관된 파일 디스크립터 플래그를 가져와요. F_GETFD 명령을 가진 POSIX fcntl 함수에 해당해요.
setfd (fd, fl)
파일 디스크립터 fd의 플래그를 fl로 설정해요. F_SETFD 명령을 가진 POSIX fcntl 함수에 해당해요.
getfl fd
열린 파일 디스크립터 fd에 대한 파일 상태 플래그와 파일이 열린 접근 모드를 가져와요. F_GETFL 명령을 가진 POSIX fcntl 함수에 해당해요.
setfl (fd, fl)
열린 파일 디스크립터 fd에 대한 파일 상태 플래그를 fl로 설정해요. F_SETFL 명령을 가진 POSIX fcntl 함수에 해당해요.
lseek (fd, off, wh)
wh가 SEEK_SET이면 열린 파일 디스크립터 fd의 파일 오프셋을 off로, SEEK_CUR이면 현재 값에 off바이트를 더한 값으로, SEEK_END이면 파일 크기에 off바이트를 더한 값으로 설정해요. off는 음수일 수 있다는 점에 유의하세요.
fsync fd
열린 파일 디스크립터 fd에 대한 모든 데이터가 디스크립터와 연관된 장치로 전송된다는 것을 나타내요. ``flush'' 연산과 비슷해요.
datatype lock_type
= F_RDLCK
| F_WRLCK
| F_UNLCK
이 생성자들은 잠금 종류를 나타내요. F_RDLCK는 공유 또는 읽기 잠금을, F_WRLCK는 배타적 또는 쓰기 잠금을 나타내요. F_UNLCK는 잠금이 해제되었거나 비활성임을 나타내요.
structure FLock
type flock
조언 잠금(advisory lock)을 나타내는 타입이에요. 아래 flock 함수에 인자로 쓰이는 레코드의 추상화로 간주할 수 있어요.
flock {ltype, whence, start, len, pid}
매개변수로 설명되는 flock 값을 만들어요. whence와 start 매개변수는 lseek에서처럼 시작 파일 위치를 제공해요. len 값은 잠글 바이트 수를 제공해요. 섹션이 파일 시작에서 시작하고 len = 0이면 전체 파일이 잠겨요. 보통 pid는 NONE이에요. 이 값은 getlk가 돌려주는 flock에서만 사용돼요.
val ltype : flock -> lock_type
val whence : flock -> whence
val start : flock -> Position.int
val len : flock -> Position.int
val pid : flock -> pid option
flock 값을 구성하는 필드에 대한 투영 함수들이에요.
getlk (fd, fl)
열린 파일 디스크립터 fd에서 잠금 설명 fl을 차단하는 첫 번째 잠금을 가져와요. F_GETLK 명령을 가진 POSIX fcntl 함수에 해당해요.
setlk (fd, fl)
열린 파일 디스크립터 fd에 대해 잠금 설명 fl에 따라 파일 세그먼트 잠금을 설정하거나 해제해요. 공유 또는 배타적 잠금을 설정할 수 없으면 예외가 즉시 발생해요. F_SETLK 명령을 가진 POSIX fcntl 함수에 해당해요.
val setlkw : file_desc * FLock.flock -> FLock.flock
setlk 함수와 비슷하지만 setlkw는 차단된 잠금이 해제될 때까지 기다려요. F_SETLKW 명령을 가진 POSIX fcntl 함수에 해당해요.
val mkBinReader : {
fd : file_desc,
name : string,
initBlkMode : bool
} -> BinPrimIO.reader
val mkTextReader : {
fd : file_desc,
name : string,
initBlkMode : bool
} -> TextPrimIO.reader
이 함수들은 열린 POSIX 파일 디스크립터를 판독기로 변환해요. 여기에서 입력 스트림을 구성할 수 있어요. 이 함수들은 POSIX의 fdopen 함수와 비슷해요. 인자 필드는 다음 의미를 가집니다:
fd
읽기용으로 열린 파일에 대한 파일 디스크립터예요.
name
사용자에게 보여주는 오류 메시지에 쓰이는 파일과 연관된 이름이에요.
initBlkMode
파일이 현재 비차단 모드이면, 즉 #1(getfl fd)에 O.nonblock 플래그가 설정되어 있으면 False예요.
val mkBinWriter : {
fd : file_desc,
name : string,
appendMode : bool,
initBlkMode : bool,
chunkSize : int
} -> BinPrimIO.writer
val mkTextWriter : {
fd : file_desc,
name : string,
appendMode : bool,
initBlkMode : bool,
chunkSize : int
} -> TextPrimIO.writer
이 함수들은 열린 POSIX 파일 디스크립터를 기록기로 변환해요. 여기에서 출력 스트림을 구성할 수 있어요. 이 함수들은 POSIX의 fdopen 함수와 비슷해요. 인자 필드는 다음 의미를 가집니다:
fd
쓰기용으로 열린 파일에 대한 파일 디스크립터예요.
name
사용자에게 보여주는 오류 메시지에 쓰이는 파일과 연관된 이름이에요.
initBlkMode
파일이 현재 비차단 모드이면, 즉 #1(getfl fd)에 O.nonblock 플래그가 설정되어 있으면 False예요.
appendMode
파일이 추가 모드이면, 즉 #1(getfl fd)에 O.append 플래그가 설정되어 있으면 True예요.
chunkSize
효율적인 쓰기를 위한 쓰기 연산의 권장 크기예요.## 더 알아보기 (Learn more)