명명된 파이프

명명된 파이프(named pipe) 또는 지명 파이프는 유닉스 및 유닉스 계열의 일반 파이프를 확장 한 것으로, 프로세스 간 통신 기법 중 하나이다. 그 개념은 마이크로소프트 윈도우도 있지만, 의미는 크게 다르다. 일반 파이프는 ‘파이프’이며, 사용하는 프로세스가 실행 중에만 존재한다. 명명된 파이프는 영구 프로세스가 소멸해도 계속 존재하기 때문에 사용하지 않으면 제거할 필요가 있다. 명명된 파이프는 파일과 같이 취급할 수 있고 프로세스 간 통신(IPC)을 위해 프로세스가 오픈되어 사용한다. 또한 동작에서 명명된 파이프를 FIFO로 부르기도 한다.

유닉스 계열
보통 셸에서 사용하는 이름의 파이프와 달리 명명된 파이프는 파일 시스템을 사용한다. mkfifo() 또는 mknod()를 이용하여 명시적으로 만들어진다. 2개의 별도 프로세스는 이름을 지정하여 그 파이프에 접근할 수 있다. 하나의 프로세스는 독자(reader)로 오픈하고, 다른 하나는 작가(writer)로 오픈한다.

예를 들어, 명명된 파이프를 만들고 파이프에 입력된 것을 gzip으로 압축하는 경우 다음과 같이하면 된다.
 mkfifo my_pipe
 gzip -9 -c < my_pipe > out.gz &
별개의 프로세스 셸에서는, 이와는 완전히 독립적으로 압축을 해서 데이터를 보낼 수도 있다.
 cat file > my_pipe

명명된 파이프는 일반 파일처럼 삭제할 수도 있다.
 rm my_pipe

명명된 파이프는 하나의 응용 프로그램에서 다른 응용 프로그램으로 정보를 전달하기 위해 임시 파일을 만들지 않고도 할 수 있다. 예를 들어, gzip의 압축 해제된 출력을 다음과 같이 명명된 파이프에 연결한다.
 mkfifo --mode=0666 /tmp/namedPipe
 gzip --stdout -d file.gz > /tmp/namedPipe
그리고 신장된 데이터를 다음과 같이 MySQL의 테이블에 로드한다.
 LOAD DATA INFILE '/tmp/namedPipe' INTO TABLE tableName;
명명된 파이프가 없으면 file.gz을 신장한 것을 일단 임시 파일에 저장하지 않으면 MySQL에 로드할 수 없다. 임시 파일에 기록하면 I/O가 더 많이 발생하여, 시간도 오래 걸리고 하드 디스크 공간도 더 필요하게 된다.

PostgreSQL 명령줄 형 프런트 엔드 psql도 명명된 파이프에서 데이터를 로드하는 기능을 갖추고 있다.

각주

외부 링크 
The Linux Programmer's Guide: Named Pipes
Linux Journal: Introduction to Named Pipes
MSDN Library: Named Pipes

프로세스 간 통신