파이프에는 명명 파이프(named pipe)와 익명 파이프(unnamed pipe) 두 가지 유형이 있다. 익명 파이프는 특별한 관계(부모-자식 또는 형제 프로세스, 동일 프로세스에 포함된 스레드끼리)에 있는 작업끼리만 사용할 수 있다. 이러한 관계에 있는 작업들은 파일 디스크립터(descriptor)를 공유하기 때문이다. 익명 파이프는 사용이 끝나면 사라진다.
파이프의 실체는 파일 디스크립터(유닉스 시스템 기준)이며, 파이프의 동작은 파일에 대한 작업(파일 읽기, 쓰기 등)과 비슷하지만, 실제 파일 시스템과 연결되지 않는다는 차이가 있다. 데이터 기록 측에서 파이프에 정보를 기록하려면 파이프를 대상으로 write() 시스템 콜을 호출하고, 파이프에서 정보를 읽을 때는 read() 시스템 콜을 사용한다. read() 시스템 콜은 파일과 비슷하게 파이프를 다루지만, 읽어 들일 정보가 없으면 대기 상태로 머무른다. 파이프의 구현은 시스템마다 다를 수 있다.
주 스레드에서 파이프를 생성한 다음, 파이프의 파일 디스크립터를 자식 스레드에 전달하면 파이프로 두 스레드 사이에 정보를 교환할 수 있다. 이런 형태가 가장 일반적인 파이프의 활용 형태다. 코드로 살펴보자.