성능 질문에 대해서는 디스크 IO가 필요하지 않기 때문에 파이프가 파일보다 효율적입니다. 그래서 cmd1 | cmd2
보다 효율적입니다 cmd1 > tmpfile; cmd2 < tmpfile
(이 힘이있는 경우에 true를하지 tmpfile
RAM 디스크 또는 명명 된 파이프 같은 다른 메모리 장치에 백업되어 있지만 명명 된 파이프의 경우, cmd1
파이프가 가득 차면 출력이 방해가 될 수 있으므로 백그라운드에서 실행되어야한다 ). 당신의 결과가 필요한 경우 cmd1
여전히 그 출력을 보낼 필요가 cmd2
, 당신은해야 cmd1 | tee tmpfile | cmd2
허용 할 cmd1
과 cmd2
디스크에서 읽기 작업을 피하는 병렬로 실행 cmd2
.
명명 된 파이프는 많은 프로세스가 동일한 파이프를 읽고 쓰는 경우에 유용합니다. 또한 프로그램이 파일 을 사용해야하는 IO에 stdin / stdout을 사용하도록 설계되지 않은 경우에도 유용 할 수 있습니다 . 명명 된 파이프는 파일 시스템 항목 (참조 목적으로) 이 있더라도 메모리에 상주하고 고정 버퍼 크기를 갖기 때문에 스토리지 관점에서 정확히 파일이 아니기 때문에 파일을 기울임 꼴로 표시했습니다 . 다른 일들 만 생각 : UNIX에서 파일을하지 않고 파일 시스템 항목이 /dev/null
또는 다른 항목 /dev
또는 /proc
.
파이프 (이름과 이름이 지정되지 않은)는 고정 버퍼 크기를 가지므로 파이프에 대한 읽기 / 쓰기 작업이 차단되어 읽기 / 쓰기 프로세스가 IOWait 상태가됩니다. 또한 메모리 버퍼에서 읽을 때 EOF를 언제 받습니까? 이 행동에 대한 규칙은 잘 정의되어 있으며 사람에게 있습니다.
파이프 (이름과 이름이 지정되지 않은)로 할 수없는 한 가지는 데이터를 다시 찾는 것입니다. 메모리 버퍼를 사용하여 구현되므로 이해할 수 있습니다.
에 대해 "everything in Linux/Unix is a file"
동의하지 않습니다. 명명 된 파이프에는 파일 시스템 항목이 있지만 정확히 파일이 아닙니다. 명명되지 않은 파이프에는 파일 시스템 항목이 없습니다 (의 경우 제외 /proc
). 그러나 UNIX에서 대부분의 IO 작업은 명명되지 않은 파이프 (및 소켓)를 포함 하여 파일 디스크립터 가 필요한 읽기 / 쓰기 기능을 사용하여 수행됩니다 . 나는 우리가 그렇게 말할 수 있다고 생각하지 않지만 "everything in Linux/Unix is a file"
, 우리는 분명히 그렇게 말할 수 있습니다 "most IO in Linux/Unix is done using a file descriptor"
.