[파이프]
파이프는 두 프로세스가 통신할 수 있는 통로이다.
[일반 파이프]
일반 파이프는 생산자-소비자 형태로 두 프로세스 간의 통신을 허용한다.
생산자는 파이프희 한 종단(쓰기 종단)에 쓰고, 소비자는 다른 종단(읽기 종단)에서 읽는다. 결과적으로 일반 파이프는 한쪽으로만 데이터를 전송할 수 있는 단방향 통신이다.
UNIX 시스템에서는 일반 파이프는 pipe(int fd[]) 함수를 사용하여 구축된다.
cf ) fd[0]은 읽기 종단, fd[1]은 쓰기 종단으로 동작한다.
파이프를 생성한 후에는 read()와 write() 시스템 콜을 사용하여 접근할 수 있다.
일반 파이프는 파이프를 생성한 프로세스 이외에는 접근을 할 수 없기 때문에 통상 부모 프로세스가 파이프를 생성하고 fork()로 생성한 자식 프로세스와 통신하기 위해 사용한다.
Windows 시스템의 일반 파이프는 익명 파이프라고 불리며 UNIX의 일반 파이프와 유사하게 동작한다.
파이프의 읽기와 쓰기는 보통 Read-File()과 WriteFile()을 사용하여 이루어진다. 파이프는 CreatePipe()함수로서 4개의 매개변수를 전달 받는다. (책 159p참고)
[지명 파이프]
일반 파이프는 프로세스들이 통신을 마치고 종료하면 일반 파이프는 없어지게 되고 부모-자식 관계여야만 하는 등 제약 조건들이 많다.
반대로 지명 파이프는 양방향 통신이 가능하며, 부모-자식 관계도 필요로 하지 않는다(동일한 기계 내에는 존재해야 한다.) 일단 지명 파이프가 구축되면 여러 프로세스들이 이를 사용하여 통신할 수 있다.
UNIX에서 지명 파이프는 FIFO라고 불린다. mkfifo() 시스템 콜을 이용하여 파이프를 생성하고 open(), read(), write(), close() 시스템 콜로 조작한다.
Windows에서는 CreateNamePipe()함수를 사용하여 생성되고 클라이언트는 ConnectNamedPipe()함수를 사용하여 지명 파이프에 연결할 수 있다. 지명 파이프를 통한 통신을 위해 ReadFile()과 WriteFile()함수를 사용할 수 있다.