The Unix 구조

The Unix 구조

POSIX(Unix) 하부 구조들을 한데 모은 루트 구조예요.

출처: 문서

본문

시놉시스 (Synopsis)

signature UNIX (* OPTIONAL *)
structure Unix :> UNIX (* OPTIONAL *)

인터페이스 (Interface)

type ('a,'b) proc
type signal
datatype exit_status
= W_EXITED
| W_EXITSTATUS of Word8.word
| W_SIGNALED of signal
| W_STOPPED of signal
val fromStatus : OS.Process.status -> exit_status
val executeInEnv : string * string list * string list
-> ('a, 'b) proc
val execute : string * string list -> ('a, 'b) proc
val textInstreamOf : (TextIO.instream, 'a) proc
-> TextIO.instream
val binInstreamOf : (BinIO.instream, 'a) proc
-> BinIO.instream
val textOutstreamOf : ('a, TextIO.outstream) proc
-> TextIO.outstream
val binOutstreamOf : ('a, BinIO.outstream) proc
-> BinIO.outstream
val streamsOf : (TextIO.instream, TextIO.outstream) proc
-> TextIO.instream * TextIO.outstream
val reap : ('a, 'b) proc -> OS.Process.status
val kill : ('a, 'b) proc * signal -> unit
val exit : Word8.word -> 'a

설명 (Description)

type ('a,'b) proc

Unix 환경에서 유용한 하위 구조들을 담아요.

type signal

다른 프로세스에 보낼 수 있는 Unix 계열 시그널이에요. 시그널 값은 다른 구조에서 얻어야 한다는 점에 유의하세요. 예를 들어 Posix 모듈을 제공하는 구현은 signal 타입과 Posix.Signal.signal 타입을 동일시할 수 있어요.

datatype exit_status
= W_EXITED
| W_EXITSTATUS of Word8.word
| W_SIGNALED of signal
| W_STOPPED of signal

이 값들은 Unix 프로세스가 멈출 수 있는 방식을 나타내요. 각각 정상 종료, 주어진 종료 값으로의 종료, 주어진 시그널 수신으로 인한 종료, 주어진 시그널 수신으로 인한 중지를 나타내요. W_EXITSTATUS가 담는 값은 0이 아니에요. 구현이 Posix 구조와 Unix 구조를 모두 제공한다면 Posix.Process.exit_status와 exit_status는 같은 타입이어야 해요.

fromStatus sts

주어진 상태의 구체적인 보기를 돌려줘요.

executeInEnv (cmd, args, env)

운영체제에 문자열 cmd가 이름인 프로그램을 인자 리스트 args와 환경 env로 실행하도록 요청해요. 프로그램은 호출 프로그램의 하위 프로세스로 실행되고, 이 함수의 반환 값은 하위 프로세스를 가리키는 추상 proc 값이에요. env 리스트의 문자열은 보통 "name=value" 형태예요 (OS.Process.getEnv 참고). executeInEnv 함수는 실패하면 OS.SysErr 예외를 발생시켜요. 실패 이유에는 메모리 부족, 프로세스가 너무 많음, cmd가 실행 파일을 가리키지 않는 경우 등이 있어요. 하위 프로세스가 명령을 실행하지 못하면(즉 execve 호출이 실패하면) 종료 코드 126으로 종료해야 해요.

execute (cmd, args)

운영체제에 문자열 cmd가 이름인 프로그램을 인자 리스트 args로 실행하도록 요청해요. 프로그램은 호출 프로그램의 하위 프로세스로 실행되고 호출 프로세스의 환경을 상속받아요. 이 함수의 반환 값은 하위 프로세스를 가리키는 추상 proc 값이에요. 이 함수의 실패 의미는 executeInEnv와 같아요. Posix 모듈을 제공하는 구현에서 이 함수는 다음과 동등해요:

fun execute (cmd, args) =
executeInEnv (cmd, args, Posix.ProcEnv.environ ())

textInstreamOf pr

binInstreamOf pr

이 함수들은 프로세스 pr의 표준 출력 스트림에 연결된 텍스트 또는 바이너리 인스트림(instream)을 돌려줘요. 같은 proc 값에 대해 이 함수들을 여러 번 호출하면 같은 기본 열린 파일 디스크립터를 공유하는 여러 스트림이 생기는데, 파일 디스크립터에 내재된 상태 때문에 예측할 수 없는 효과가 발생할 수 있어요.

textOutstreamOf pr

binOutstreamOf pr

이 함수들은 프로세스 pr의 표준 입력 스트림에 연결된 텍스트 또는 바이너리 아웃스트림(outstream)을 돌려줘요. 같은 proc 값에 대해 이 함수들을 여러 번 호출하면 같은 기본 열린 파일 디스크립터를 공유하는 여러 스트림이 생기는데, 버퍼링 때문에 예측할 수 없는 효과가 발생할 수 있어요.

streamsOf pr

pr과 관련된 입력·출력 텍스트 스트림의 쌍을 돌려줘요. 이 함수는 (textInstream pr, textOutstream pr)와 동등하며 하위 호환성을 위해 제공돼요.

reap pr

pr과 관련된 입력·출력 스트림을 닫은 다음, pr에 해당하는 시스템 프로세스가 종료될 때까지 현재 프로세스를 일시 중지해요. pr이 종료될 때 준 종료 상태를 돌려줘요. pr에 reap을 다시 적용하면 이전 종료 상태를 즉시 돌려줘야 해요. 구현 참고: 보통 종료된 프로세스의 종료 상태를 한 번 제공하고 나면 기본 운영체제가 다시 제공하리라 기대할 수 없어요. 따라서 종료 상태는 아마 캐시가 필요해요. 또한 reap은 모니터링하는 프로세스가 종료될 때까지 반환하면 안 된다는 점에 유의하세요. 특히 프로세스가 일시 중지되었을 뿐인데 반환하지 않도록 구현에 주의해야 해요.

kill (pr,s)

시그널 s를 프로세스 pr에 보내요.

exit st

OS.Process.atExit에 등록된 모든 동작을 실행하고, Library를 사용해 연 모든 I/O 스트림을 비우고 닫은 뒤, 종료 상태 st로 SML 프로세스를 종료해요.## 더 알아보기 (Learn more)