os.pipe() 메서드는 새로운 파이프(pipe)를 생성하고, 각각 읽기와 쓰기에 사용할 수 있는 파일 디스크립터 쌍 (r, w)을 반환합니다. 파이프는 한쪽 끝에서 데이터를 쓰면 다른 쪽 끝에서 해당 데이터를 읽을 수 있는 단방향 통신 채널로, 주로 부모 프로세스와 자식 프로세스 사이에서 데이터를 주고받을 때 활용됩니다.
예제
아래 예제는 os.fork()로 자식 프로세스를 생성한 뒤, 자식이 파이프에 텍스트를 쓰면 부모가 이를 읽어 화면에 출력하는 과정을 보여줍니다.
import os, sys
# 읽기(r)와 쓰기(w)에 사용할 파일 디스크립터 생성
r, w = os.pipe()
processid = os.fork()
if processid:
# 부모 프로세스
os.close(w) # 쓰기 디스크립터는 사용하지 않으므로 닫음
r = os.fdopen(r) # 파일 디스크립터를 파일 객체로 변환
print("Parent reading")
data = r.read() # 자식이 보낸 텍스트를 읽음
print("text =", data)
sys.exit(0)
else:
# 자식 프로세스
os.close(r) # 읽기 디스크립터는 사용하지 않으므로 닫음
w = os.fdopen(w, 'w')
print("Child writing")
w.write("Text written by child...")
w.close()
print("Child closing")
sys.exit(0)
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Parent reading Child writing Child closing text = Text written by child...
동작 원리 정리
- os.pipe(): 읽기 전용 디스크립터
r과 쓰기 전용 디스크립터w한 쌍을 반환합니다. - os.fork(): 현재 프로세스를 복제하여 자식 프로세스를 생성하며, 부모에게는 자식의 PID를, 자식에게는 0을 반환합니다.
- 부모 프로세스: 사용하지 않는 쓰기 끝(
w)을 먼저 닫은 후,r.read()로 자식이 전송한 데이터를 읽습니다. - 자식 프로세스: 사용하지 않는 읽기 끝(
r)을 닫은 후,w에 데이터를 쓰고 스트림을 닫아 내용을 모두 전송합니다.
이처럼 os.pipe()는 서로 관련 없는 프로세스가 아니라, fork()로 생성된 부모-자식 관계의 프로세스 간에 간단한 단방향 IPC(프로세스 간 통신)를 구현할 때 매우 유용하게 사용됩니다.