APUE에서
FIFO를 사용할 수 있습니다.일련의 셸 명령으로 출력 스트림을 복사합니다.. 이것데이터가 중간 디스크 파일에 기록되지 않도록 방지(중간 디스크 파일을 피하기 위해 파이프를 사용하는 것과 유사합니다).
그러나 파이프는 프로세스 간의 선형 연결에만 사용할 수 있는 반면 FIFO에는 이름이 있으므로 다음 용도로 사용할 수 있습니다. 비선형 연결.
필터링된 입력 스트림을 두 번 처리해야 하는 프로세스를 생각해 보세요.
mkfifo fifo1 prog3 < fifo1 & prog1 < infile | tee fifo1 | prog2
FIFO를 생성한 다음 백그라운드에서 prog3을 시작하여 FIFO에서 데이터를 읽습니다. 그런 다음 prog1을 시작하고 tee를 사용하여 입력을 FIFO 및 prog2로 보냅니다.
FIFO "일련의 쉘 명령에 걸쳐 출력 스트림을 복제"하는 방법은 무엇입니까? FIFO를 사용하여 수행 되지 않습니까
tee
?예제에서는
mkfifo fifo1
현재 디렉터리에 파일이 생성되고fifo1
일반 파일로 교체 가능한 것으로 나타납니다. 그렇다면 "데이터가 중간 디스크 파일에 기록되는 것을 방지하는" FIFO의 요점은 무엇입니까?프로세스 간의 "선형 연결"과 "비선형 연결"은 무엇을 의미합니까? FIFO는 비선형 연결에 사용할 수 있지만 파이프는 프로세스 간의 선형 연결에만 사용할 수 있습니다. 이것이 의미하는 바는 무엇입니까?
감사해요.
답변1
APUE는 “선입선출(First in First Out)”이라고 말합니다.사용할 수 있다출력 스트림 복사"에서는 FIFO가 실제로 출력 스트림을 복사한다고 말하지 않습니다. 지적한 대로 복사는
tee
예제에서 수행됩니다.mkfifo
포함된 디렉터리에 "파일"로 표시되는 FIFO를 생성하지만 데이터가 디스크에 도달하지 않기 때문에 FIFO에 쓰는 것은 파일에 쓰는 것과 다릅니다. 파이프는 명명된 파이프든 다른 파이프든 데이터 저장을 제공하지 않지만 수신자 없이 통신 채널을 제공합니다. 파이프의 쓰기 끝은 데이터를 쓸 수 없으며 파이프는 데이터를 전송만 할 뿐 데이터를 저장하지 않습니다. (대부분의 시스템 파이프에서예성능 향상을 위해 작은 커널 버퍼로 지원되지만 이는 구현 세부 사항입니다. )프로세스 간의 선형 연결은 선형 그래프로 표현될 수 있는 파이프입니다. 귀하의 예에서 마지막 줄을 다음과 같이 나타낼 수 있습니다.
infile → prog1 → tee fifo1 → prog3
이는 선형이지만 처리할 요소가 더 적은 전체 체인을 나타내려면 다음이 필요합니다.
infile → prog1 → prog2 → prog3
이는 비선형입니다(그래프에 노드가 있고
prog1
두 개의 종료 노드가 있음).