파이프

파이프 (Pipes)

파이프(pipe)는 한쪽으로 쓴 데이터를 다른 쪽에서 읽을 수 있게 해주는 양방향 연결 통로예요. Racket의 make-pipe가 만드는 파이프는 Racket 내부 전용으로, 서로 다른 프로세스 간 통신을 위한 OS 수준 파이프와는 달라요. 이 절에서는 Racket 파이프 포트를 만들고 확인하는 방법을 알아볼게요.

출처: Racket Reference

본문

Racket 파이프는 Racket 내부에 존재하며, 서로 다른 프로세스 간 통신을 위한 OS 수준 파이프와는 관련이 없어요. OS 수준 파이프는 subprocess로 만들 수도 있고, Unix 파일 시스템의 기존 명명된 파일을 열거나, Racket을 원래 입력·출력·오류 포트에 파이프를 준 채로 시작해서 만들 수도 있어요. 그런 파이프는 make-pipe가 만드는 파이프와 달리 파일 스트림 포트(file-stream port)예요.

procedure

(pipe-port? p) → boolean?
  p : port?

pmake-pipe로 만든 파이프의 한쪽 끝이면 #t를, 그렇지 않으면 #f를 돌려줘요.

base 패키지의 8.15.0.9 버전에서 추가됐어요.

procedure

(make-pipe [limit input-name output-name])
  → (and/c input-port? pipe-port?)
     (and/c output-port? pipe-port?)
  limit : exact-positive-integer? = #f
  input-name : any/c = 'pipe
  output-name : any/c = 'pipe

두 개의 포트 값을 돌려줘요. 첫 번째 포트는 입력 포트, 두 번째는 출력 포트예요. 출력 포트에 쓴 데이터는 중간 버퍼링 없이 입력 포트에서 읽혀요. 다른 종류의 포트들과 달리, 파이프 포트는 가비지 컬렉션에 의해 회수되기 위해 명시적으로 닫을 필요가 없어요.

limit#f면 새 파이프는 읽지 않은 바이트 수에 제한이 없어요(즉 사용 가능한 메모리에 의해서만 제한돼요). limit이 양수면 파이프는 많아야 limit 개의 읽지 않은/peek하지 않은 바이트를 보유하며, 이후 출력 포트에 쓰는 것은 입력 포트에서 읽거나 peek해서 공간이 생길 때까지 블록돼요. (peek은 peek된 바이트가 읽힐 때까지 포트의 용량을 사실상 늘려요.)

선택 인자 input-nameoutput-name은 각각 돌려주는 입력·출력 포트의 이름으로 사용돼요.

procedure

(pipe-content-length pipe-port) → exact-nonnegative-integer?
  pipe-port : pipe-port?

파이프에 들어 있는 바이트 수를 돌려줘요. pipe-portmake-pipe가 만든 파이프의 두 포트 중 하나예요. 파이프의 콘텐츠 길이는 파이프에 쓰여졌지만 아직 읽히지 않은(peek은 됐을 수 있는) 모든 바이트를 세어요.

더 알아보기