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)