명명된 파이프(FIFO)란 무엇인가?
FIFO(First In, First Out)는 일반 파일과 동일한 방식으로 접근할 수 있는 특수한 형태의 파이프입니다. 한 번 생성된 FIFO는 os.unlink() 등으로 명시적으로 삭제하기 전까지 시스템에 계속 존재합니다.
FIFO는 주로 "클라이언트"와 "서버" 유형의 프로세스 사이에서 만남 지점(rendezvous) 역할을 하며, 프로세스 간 통신(IPC)에 널리 활용됩니다. 일반적인 사용 패턴은 다음과 같습니다.
- 서버: 읽기 모드로 FIFO를 엽니다.
- 클라이언트: 쓰기 모드로 FIFO를 엽니다.
여기서 중요한 점은 mkfifo()가 실제로 FIFO를 여는 함수가 아니라는 것입니다. 이 함수는 단지 만남 지점이 될 파이프 경로만 생성할 뿐이며, 실제 데이터 송수신은 이후 별도의 open() 호출을 통해 이루어집니다.
Python에서 FIFO 생성하기
Python에서 명명된 파이프를 만들려면 표준 라이브러리의 os.mkfifo() 함수를 사용합니다. 다만 지정한 경로에 이미 같은 이름의 파일이 존재하면 FileExistsError 예외가 발생하므로, try-except 블록으로 감싸 안전하게 처리하는 것이 좋습니다.
예제 코드
import os
# 생성할 FIFO 경로
path = "/tmp/hourly"
try:
os.mkfifo(path)
except OSError as e:
print("FIFO 생성 실패:", e)
else:
fifo = open(path, 'w')
print("FIFO가 정상적으로 열렸습니다")
print("경로가 생성되었습니다")
이 프로그램을 실행하면 /tmp/hourly 경로에 명명된 파이프가 생성되고, 쓰기 모드로 열립니다. 이후 다른 프로세스가 동일한 경로를 읽기 모드로 열면 두 프로세스 간에 데이터를 주고받을 수 있습니다.
활용 시 유의 사항
os.mkfifo()는 Linux, macOS 등 Unix 계열 운영체제에서만 사용할 수 있으며, Windows에서는 지원되지 않습니다.- FIFO는 단방향 통신만 가능하므로, 양방향 통신이 필요하다면 파이프를 두 개 생성해야 합니다.
- 쓰기 모드로 FIFO를 열면 읽기 쪽이 열릴 때까지 블로킹될 수 있으므로, 프로세스 간 열기 순서를 고려해야 합니다.
- 사용이 끝난 FIFO는
os.unlink()로 삭제하여 시스템을 깨끗하게 유지하는 것이 좋습니다.