Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 os.pipe() 함수란? 역할과 사용법 총정리

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(프로세스 간 통신)를 구현할 때 매우 유용하게 사용됩니다.