The Posix.FileSys 구조

The Posix.FileSys 구조

POSIX 파일 시스템 인터페이스를 제공하는 구조예요.

출처: 문서

본문

시놉시스 (Synopsis)

signature POSIX_FILE_SYS
structure FileSys : POSIX_FILE_SYS

인터페이스 (Interface)

eqtype uid
eqtype gid
eqtype file_desc
val fdToWord : file_desc -> SysWord.word
val wordToFD : SysWord.word -> file_desc
val fdToIOD : file_desc -> OS.IO.iodesc
val iodToFD : OS.IO.iodesc -> file_desc option
type dirstream
val opendir : string -> dirstream
val readdir : dirstream -> string option
val rewinddir : dirstream -> unit
val closedir : dirstream -> unit
val chdir : string -> unit
val getcwd : unit -> string
val stdin : file_desc
val stdout : file_desc
val stderr : file_desc
structure S : sig
eqtype mode
include BIT_FLAGS
where type flags = mode
val irwxu : mode
val irusr : mode
val iwusr : mode
val ixusr : mode
val irwxg : mode
val irgrp : mode
val iwgrp : mode
val ixgrp : mode
val irwxo : mode
val iroth : mode
val iwoth : mode
val ixoth : mode
val isuid : mode
val isgid : mode
end
structure O : sig
include BIT_FLAGS
val append : flags
val excl : flags
val noctty : flags
val nonblock : flags
val sync : flags
val trunc : flags
end
datatype open_mode
= O_RDONLY
| O_WRONLY
| O_RDWR
val openf : string * open_mode * O.flags -> file_desc
val createf : string * open_mode * O.flags * S.mode
-> file_desc
val creat : string * S.mode -> file_desc
val umask : S.mode -> S.mode
val link : {old : string, new : string} -> unit
val mkdir : string * S.mode -> unit
val mkfifo : string * S.mode -> unit
val unlink : string -> unit
val rmdir : string -> unit
val rename : {old : string, new : string} -> unit
val symlink : {old : string, new : string} -> unit
val readlink : string -> string
eqtype dev
val wordToDev : SysWord.word -> dev
val devToWord : dev -> SysWord.word
eqtype ino
val wordToIno : SysWord.word -> ino
val inoToWord : ino -> SysWord.word
structure ST : sig
type stat
val isDir : stat -> bool
val isChr : stat -> bool
val isBlk : stat -> bool
val isReg : stat -> bool
val isFIFO : stat -> bool
val isLink : stat -> bool
val isSock : stat -> bool
val mode : stat -> S.mode
val ino : stat -> ino
val dev : stat -> dev
val nlink : stat -> int
val uid : stat -> uid
val gid : stat -> gid
val size : stat -> Position.int
val atime : stat -> Time.time
val mtime : stat -> Time.time
val ctime : stat -> Time.time
end
val stat : string -> ST.stat
val lstat : string -> ST.stat
val fstat : file_desc -> ST.stat
datatype access_mode = A_READ | A_WRITE | A_EXEC
val access : string * access_mode list -> bool
val chmod : string * S.mode -> unit
val fchmod : file_desc * S.mode -> unit
val chown : string * uid * gid -> unit
val fchown : file_desc * uid * gid -> unit
val utime : string
* {actime : Time.time, modtime : Time.time} option
-> unit
val ftruncate : file_desc * Position.int -> unit
val pathconf : string * string -> SysWord.word option
val fpathconf : file_desc * string -> SysWord.word option

설명 (Description)

eqtype uid

파일의 접근 권한을 나타내는 비트 마스크 타입이에요.

eqtype gid

파일의 타입(정규 파일, 디렉토리 등)을 나타내는 타입이에요.

eqtype file_desc

stat은 파일의 상태를, fstat은 열린 파일의 상태를 돌려줘요.

val fdToWord : file_desc -> SysWord.word
val wordToFD : SysWord.word -> file_desc

파일 시스템을 나타내는 값과 상태를 제공해요.

val fdToIOD : file_desc -> OS.IO.iodesc
val iodToFD : OS.IO.iodesc -> file_desc option

이들은 POSIX 열린 파일 디스크립터와 OS 하위시스템이 사용하는 핸들 사이를 변환해요. iodToFD 함수는 option 타입을 돌려주는데, 어떤 시스템에서는 일부 열린 I/O 장치가 기본 열린 파일 디스크립터와 연관되어 있지 않기 때문이에요.

type dirstream

읽기용으로 열린 디렉터리 스트림이에요. 디렉터리 스트림은 특정 디렉터리에 있는 모든 디렉터리 항목의 정렬된 시퀀스예요. 이 타입은 OS.FileSys.dirstream과 동일해요.

opendir dirName

dirName 매개변수가 지정한 디렉터리를 열고 디렉터리 스트림을 연관시켜요. 디렉터리 스트림은 첫 번째 항목에 위치해요.

readdir dir

디렉터리 스트림 dir에서 파일 이름 하나를 돌려주고 제거해요. 디렉터리 스트림이 비어 있으면(즉 모든 항목이 스트림에서 읽혔으면) NONE을 돌려줘요. "."(현재 디렉터리)와 ".."(부모 디렉터리) 항목은 절대 돌려주지 않아요. 근거: 현재와 부모 디렉터리 항목을 걸러내는 이유는 디렉터리 트리의 재귀 순회를 더 쉽게 만들기 때문이에요.

rewinddir d

디렉터리 스트림 d를 읽기 위해 시작 지점으로 재배치해요.

closedir d

디렉터리 스트림 d를 닫아요. 이전에 닫힌 dirstream을 닫아도 예외를 발생시키지 않아요.

chdir s

현재 작업 디렉터리를 s로 변경해요.

val getcwd : unit -> string

현재 작업 디렉터리의 절대 경로명이에요.

val stdin : file_desc
val stdout : file_desc
val stderr : file_desc

표준 입력, 출력, 오류 파일 디스크립터예요.

structure S

eqtype mode

파일 모드는 파일 소유자, 파일 그룹 구성원, 그 외 사용자에 대한 (읽기, 쓰기, 실행) 권한 집합이에요.

val irwxu : mode

``사용자''(파일 소유자)에 대한 읽기, 쓰기, 실행 권한이에요.

val irusr : mode

``사용자''(파일 소유자)에 대한 읽기 권한이에요.

val iwusr : mode

``사용자''(파일 소유자)에 대한 쓰기 권한이에요.

val ixusr : mode

``사용자''(파일 소유자)에 대한 실행 권한이에요.

val irwxg : mode

파일 그룹 구성원에 대한 읽기, 쓰기, 실행 권한이에요.

val irgrp : mode

파일 그룹 구성원에 대한 읽기 권한이에요.

val iwgrp : mode

파일 그룹 구성원에 대한 쓰기 권한이에요.

val ixgrp : mode

파일 그룹 구성원에 대한 실행 권한이에요.

val irwxo : mode

``그 외 사용자''(모든 사용자)에 대한 읽기, 쓰기, 실행 권한이에요.

val iroth : mode

``그 외 사용자''(모든 사용자)에 대한 읽기 권한이에요.

val iwoth : mode

``그 외 사용자''(모든 사용자)에 대한 쓰기 권한이에요.

val ixoth : mode

``그 외 사용자''(모든 사용자)에 대한 실행 권한이에요.

val isuid : mode

Set-user-id 모드로, 파일을 실행하는 어떤 사용자의 유효 사용자 ID가 파일 소유자의 것과 같아져야 한다는 것을 나타내요.

val isgid : mode

Set-group-id 모드로, 파일을 실행하는 어떤 사용자의 유효 그룹 ID가 파일 그룹과 같아져야 한다는 것을 나타내요.

structure O

구조 Posix.FileSys.O에는 openf 호출에 쓰이는 파일 상태 플래그가 담겨 있어요.

val append : flags

설정되면 각 쓰기 전에 파일 포인터가 파일 끝으로 설정돼요.

val excl : flags

이 플래그는 파일이 이미 존재하면 열기를 실패하게 해요.

val noctty : flags

path 매개변수가 터미널 장치를 식별하면 이 플래그는 그 터미널 장치가 프로세스의 제어 터미널이 되지 않도록 보장해요.

val nonblock : flags

파일에 대한 열기, 읽기, 쓰기 연산이 비차단이 돼요.

val sync : flags

설정되면 일반 파일과 블록 장치에 대한 갱신과 쓰기가 동기화된 갱신이 돼요. 동기화된 갱신(writeVec, writeArr, ftruncate, trunc로 openf)을 수행하는 함수가 반환될 때, 호출하는 프로세스는 파일이 지연 갱신용으로도 열려 있어도 파일에 대한 모든 데이터가 영구 저장소에 쓰였다는 보장을 받아요.

val trunc : flags

이 플래그는 열기에 따라 파일을 (길이 0으로) 자르게 해요.

datatype open_mode

열린 파일에 허용되는 연산이에요.

= O_RDONLY

읽기 전용으로 파일을 열어요.

| O_WRONLY

쓰기 전용으로 파일을 열어요.

| O_RDWR

읽기와 쓰기용으로 파일을 열어요.

openf (s, om, f)

createf (s, om, f, m)

이 호출들은 이름이 s인 파일을 열기 모드 om에 따라 읽기, 쓰기 또는 둘 다용으로 열어요. 플래그 f는 열린 파일의 상태를 지정해요. 파일이 존재하지 않으면 openf는 OS.SysErr 예외를 발생시키는 반면 createf는 파일을 만들고 보호 모드를 m으로 설정해요(umask에 의해 수정됨). C에서 openf와 createf의 역할은 open 함수에 결합되어 있다는 점에 유의하세요. 전자는 O_CREAT 플래그가 없는 open처럼 작동하고, 후자는 O_CREAT 플래그와 지정된 권한 모드가 있는 open처럼 작동해요. 또한 createf 함수는 C의 이름을 닮은 creat 함수와 혼동해서는 안 돼요.

creat (s, m)

쓰기용으로 이름이 s인 파일을 열어요. 파일이 존재하면 이 호출은 파일을 길이 0으로 자르고, 존재하지 않으면 파일을 만들고 보호 모드를 m으로 설정해요(umask에 의해 수정됨). 이는 다음 표현과 동등해요:

createf(s,O_WRONLY,O.trunc,m)

umask cmask

프로세스의 파일 모드 생성 마스크를 cmask로 설정하고 이전 마스크 값을 돌려줘요. 파일이 (openf, creat, mkdir 등에 의해) 생성될 때마다 파일 모드 생성 마스크에 설정된 모든 파일 권한이 생성된 파일의 모드에서 제거돼요. 이 제거는 사용자가 파일에 대한 기본 접근을 제한할 수 있게 해요. 마스크는 자식 프로세스가 상속해요.

link {old, new}

기존 파일에 추가 하드 링크(디렉터리 항목)를 만들어요. old와 new 링크 모두 기본 객체에 대한 동등한 접근 권한을 공유해요. old와 new 모두 같은 파일 시스템에 있어야 해요. 디렉터리에 대한 하드 링크는 만들 수 없어요. 성공적으로 완료되면 link는 old 파일의 파일 상태 변경 시간을 갱신하고, 새 항목을 담고 있는 디렉터리의 파일 상태 변경 시간과 수정 시간을 갱신해요. (Posix.FileSys.ST 참조.)

mkdir (s, m)

이름이 s이고 보호 모드가 m인(umask에 의해 수정됨) 새 디렉터리를 만들어요.

mkfifo (s, m)

보호 모드가 m인(umask에 의해 수정됨) FIFO 특수 파일(또는 named pipe) s를 만들어요.

unlink path

path가 지정한 디렉터리 항목을 제거하고, 항목이 하드 링크이면 링크가 참조하는 파일의 링크 수를 줄여요. 파일에 대한 모든 링크가 제거되고 어떤 프로세스도 파일을 열거나 매핑하지 않으면 파일과 연관된 모든 자원이 회수되고 파일은 더 이상 접근할 수 없게 돼요. 마지막 링크가 제거될 때 하나 이상의 프로세스가 파일을 열거나 매핑하고 있으면 링크는 unlink가 반환되기 전에 제거되지만, 파일 내용의 제거는 파일에 대한 모든 열기나 매핑 참조가 제거될 때까지 연기돼요. path 매개변수가 심볼릭 링크를 가리키면 심볼릭 링크 자체가 제거돼요.

rmdir s

비어 있어야 하는 디렉터리 s를 제거해요.

rename {old, new}

파일 시스템 객체의 이름을 old에서 new로 바꿔요.

symlink {old, new}

심볼릭 링크 new를 만들어요. new로 해석되는 경로명의 어떤 구성 요소도 텍스트 old로 대체돼요. old는 상대 또는 절대 경로명일 수 있고 어떤 기존 파일의 경로명이 아닐 수도 있다는 점에 유의하세요.

readlink s

심볼릭 링크 s의 값을 읽어요.

eqtype dev

장치 식별자예요. 장치 식별자와 파일 일련 번호(inode 또는 ino)가 파일을 고유하게 식별해요.

val wordToDev : SysWord.word -> dev
val devToWord : dev -> SysWord.word

이 함수들은 dev 값과 운영체제가 장치를 식별하는 워드 사이를 변환해요. wordToDev가 만든 값이 유효한 장치 식별자에 해당한다는 검증은 없어요.

eqtype ino

파일 일련 번호(inode)예요.

val wordToIno : SysWord.word -> ino
val inoToWord : ino -> SysWord.word

이 함수들은 ino 값과 운영체제가 inode를 식별하는 워드 사이를 변환해요. wordToIno가 만든 값이 유효한 inode에 해당한다는 검증은 없어요.

structure ST

type stat

이 타입은 파일에 관한 상태 정보를 모델링해요.

val isDir : stat -> bool
val isChr : stat -> bool
val isBlk : stat -> bool
val isReg : stat -> bool
val isFIFO : stat -> bool
val isLink : stat -> bool
val isSock : stat -> bool

이 함수들은 매개변수가 설명하는 파일이 각각 디렉터리, 문자 특수 장치, 블록 특수 장치, 일반 파일, FIFO, 심볼릭 링크, 소켓이면 true를 돌려줘요.

mode st

st가 설명하는 파일의 보호 모드를 돌려줘요.

val ino : stat -> ino
val dev : stat -> dev

이들은 해당 파일의 파일 일련 번호(inode)와 장치 식별자를 돌려줘요(각각).

nlink st

st가 설명하는 파일에 대한 하드 링크 수를 돌려줘요.

val uid : stat -> uid
val gid : stat -> gid

이들은 파일의 소유자와 그룹 ID를 돌려줘요.

size st

st가 설명하는 파일의 크기(바이트 수)를 돌려줘요.

val atime : stat -> Time.time
val mtime : stat -> Time.time
val ctime : stat -> Time.time

이 함수들은 파일의 마지막 접근 시간, 마지막 수정 시간, 마지막 상태 변경 시간을 돌려줘요(각각).

val stat : string -> ST.stat
val lstat : string -> ST.stat
val fstat : file_desc -> ST.stat

이들은 파일 시스템 객체에 대한 정보를 돌려줘요. stat와 lstat의 경우 객체는 경로명으로 지정돼요. 빈 문자열은 예외를 일으킨다는 점에 유의하세요. fstat의 경우 열린 파일 디스크립터가 제공돼요. lstat는 stat와 달리, 경로명 인자가 심볼릭 링크이면 정보가 링크가 가리키는 파일이 아니라 링크 자체에 관한 것이에요.

datatype access_mode = A_READ | A_WRITE | A_EXEC

이 타입은 OS.FileSys.access_mode와 동일해요.

access (s, l)

파일 s의 접근 가능성을 검사해요. l이 빈 목록이면 파일의 존재를 검사하고, l이 A_READ를 담고 있으면 프로세스의 실사용자·실그룹 ID에 기반해 s의 읽기 가능성을 검사하는 식이에요. 반환되는 값은 오직 프로세스의 적절한 권한과 파일의 권한에만 의존해요. access가 어떤 디렉터리를 쓰기 가능으로 표시할 수 있지만, 그 디렉터리를 쓰기용으로 열려고 하면 실패할 수 있어요(그곳에 파일을 만들 수는 있음). 파일의 권한이 실행 가능함을 나타낼 수 있지만, 파일이 적절한 형식이 아니면 exec가 실패할 수 있어요. 반대로 프로세스가 적절한 권한을 가지면, 적절한 파일 권한 중 어떤 것도 설정되지 않았어도 access는 true를 돌려줘요.

chmod (s, mode)

s의 권한을 mode로 변경해요.

fchmod (fd, mode)

fd로 열린 파일의 권한을 mode로 변경해요.

chown (s, uid, gid)

파일 s의 소유자와 그룹을 각각 uid와 gid로 변경해요.

fchown (fd, uid, gid)

fd로 열린 파일의 소유자와 그룹을 각각 uid와 gid로 변경해요.

utime (f, SOME{actime,modtime})

파일 f의 접근 및 수정 시간을 각각 actime과 modtime으로 설정해요.

utime (f, NONE)

파일의 접근 및 수정 시간을 현재 시간으로 설정해요.

ftruncate (fd, n)

fd로 열린 파일의 길이를 n바이트로 변경해요. 새 길이가 이전 길이보다 작으면 n바이트 너머의 모든 데이터는 버려져요. 새 길이가 이전 길이보다 크면 파일은 필요한 만큼의 0바이트로 새 길이까지 확장돼요.

pathconf (s, p)

fpathconf (fd, p)

이 함수들은 s 또는 fd가 지정한 파일의 기본이 되는 파일 시스템의 속성 p 값을 돌려줘요. 정수 값 속성의 경우 값이 무한이면 NONE을, 경계가 있으면 SOME(v)를 돌려줘요(여기서 v가 값). 불리언 값 속성의 경우 값이 true면 SOME(1)이, 그렇지 않으면 SOME(0) 또는 NONE이 돌려져요. p가 유효한 속성이 아니거나 구현이 그 속성을 파일과 연관시키지 않는 경우를 포함해 문제가 생기면 OS.SysErr 예외가 발생해요. pathconf의 경우 명명된 파일의 읽기, 쓰기, 실행 권한은 필요하지 않지만, 파일로 이어지는 경로의 모든 디렉터리는 검색 가능해야 해요. POSIX가 요구하는 속성은 아래에 설명돼요. 특정 구현은 추가 속성을 지원할 수 있어요.

"CHOWN_RESTRICTED"

지정된 디렉터리에 있는 (디렉터리 외) 모든 파일에 대한 chown 사용이 적절한 권한을 가진 프로세스로 제한되면 True예요. 이 속성은 디렉터리에만 적용돼요.

"LINK_MAX"

ST.nlink 함수가 돌려주는 파일 링크 수의 최대값이에요.

"MAX_CANON"

입력 큐에 저장할 수 있는 최대 바이트 수예요. 이 속성은 터미널 장치에만 적용돼요.

"MAX_INPUT"

프로세스가 읽기 전에 입력 큐에 허용되는 최대 바이트 수예요. 이 속성은 터미널 장치에만 적용돼요.

"NAME_MAX"

파일 이름의 최대 바이트 수예요. 이 값은 13만큼 작을 수 있지만 255보다 크지는 않아요. 이 속성은 디렉터리에만 적용되고 그 값은 디렉터리 내 파일 이름에 적용돼요.

"NO_TRUNC"

"NAME_MAX"가 허용하는 것보다 긴 파일 이름을 제공하면 오류가 발생하면 True, 긴 파일 이름이 잘리면 false예요. 이 속성은 디렉터리에만 적용돼요.

"PATH_MAX"

경로명의 최대 바이트 수예요. 이 값은 65,535보다 크지 않고, 지정된 디렉터리가 작업 디렉터리일 때 상대 경로명의 최대 길이예요. 이 속성은 디렉터리에만 적용돼요.

"PIPE_BUF"

원자적으로 쓰임이 보장되는 최대 바이트 수예요. 이는 FIFO에만 적용돼요. 반환된 값은 참조된 객체에 적용돼요. 경로나 파일 디스크립터 매개변수가 디렉터리를 가리키면 반환된 값은 그 디렉터리에 존재하거나 만들어질 수 있는 어떤 FIFO에도 적용돼요.

"VDISABLE"

정의되면 Posix.TTY.V에 지정된 터미널 특수 문자를 비활성화하는 데 쓸 수 있는 문자 c의 정수 코드 ord(c)예요. 이 속성은 터미널 장치에만 적용돼요.

"ASYNC_IO"

파일에 비동기 입력 또는 출력 연산이 수행될 수 있으면 True예요.

"SYNC_IO"

파일에 동기 입력 또는 출력 연산이 수행될 수 있으면 True예요.

"PRIO_IO"

파일에 우선순위 입력 또는 출력 연산이 수행될 수 있으면 True예요. 구현 참고: 구현은 정수를 돌려주는 운영체제의 pathconf 또는 fpathconf 함수를 호출할 수 있어요. 반환된 값이 -1이고 errno가 설정되었으면 예외가 발생해요. 그렇지 않으면 반환된 값 -1은 NONE에 매핑되고, 다른 값은 SOME에 싸서 반환돼야 해요. 근거: boolean의 int option으로의 인코딩은, false에 두 값이 있는 것이 불쾌한 선택이에요. 이 두 함수를 네 개로 나누어 한 쌍이 현재 반환 타입으로 정수 값 속성을 처리하고 다른 쌍이 bool 타입 값을 돌려주며 불리언 값 속성을 처리하는 것이 더 좋을 텐데요. 불행히도 POSIX pathconf와 fpathconf 함수의 성질상 구현자에게 악몽이 될 거예요. 먼저 이 함수들의 명세는 boolean과 숫자 모두에 음이 아닌 정수 반환 값을 제공해요. 시스템 include 파일은 속성의 타입에 대한 고유 정보를 제공하지 않아요. POSIX가 지정한 기본 속성은 고정된 타입을 가지지만, 각 시스템은 자체 비표준 속성을 추가할 수 있어요. 따라서 SML 구현이 구분을 하려면 예를 들어 시스템별 매뉴얼 페이지에서 정보를 어떻게든 얻는 데 의존해야 해요. 게다가 POSIX 명세는 boolean 값이 어떻게 인코딩되는지 불명확해요. 어떤 시스템은 false에 0을 돌려주고, 다른 시스템은 errno를 설정하지 않고 -1을 돌려주는 것처럼 보여요. 기술적으로 후자의 값은 속성 값이 알려지지 않았거나 지정되지 않았음을 의미하는 것으로 해석될 수 있어요. 프로그래머의 관점에서 이는 속성이 사용할 수 없음을 뜻해요. 이 상황은 아마도 시스템별로 이 함수들을 자동 생성하는 것을 배제할 거예요. 이를 감안하면 현재 반환 타입과 값이 유일하게 합리적인 선택으로 보여요.## 더 알아보기 (Learn more)

  • [ Top | Parent | Contents | Index | Root ] Generated April 12
  • 2004 Last Modified July 1
  • 2002 Comments to John Reppy. This document may be distributed freely over the internet as long as the copyright notice and license terms below are prominently displayed within every machine-readable copy. Copyright © 2004 AT&T and Lucent Technologies. All rights reserved. Permission is granted for internet users to make one paper copy for their own personal use. Further hardcopy reproduction is strictly prohibited. Permission to distribute the HTML document electronically on any medium other than the internet must be requested from the copyright holders by contacting the editors. Printed versions of the SML Basis Manual are available from Cambridge University Press. To order
  • please visit www.cup.org (North America) or www.cup.cam.ac.uk (outside North America).