![이 네 가지 명령(fifo, 프로세스 교체, 리디렉션...)의 차이점은 무엇입니까?](https://linux55.com/image/38111/%EC%9D%B4%20%EB%84%A4%20%EA%B0%80%EC%A7%80%20%EB%AA%85%EB%A0%B9(fifo%2C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%20%EA%B5%90%EC%B2%B4%2C%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98...)%EC%9D%98%20%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내 목표는 nc
단일 fifo
. .).
sh
저는 Bash를 사용하고 있어서 모든 명령이 POSIX에서 작동하는지 아닌지 잘 모르겠습니다. zsh
, ksh
, ...
다음은 제목에서 언급한 네 가지 명령입니다(이 작업을 수행했다고 가정 mkfifo fifo
).
cat fifo | nc -l localhost 8888 > fifo
exec 3<> fifo && nc -l localhost 8888 <&3 >&3 && exec 3>&-
nc -l localhost 8888 <(cat fifo) > fifo
nc -l localhost 8888 < fifo > fifo
이제 나는 이 4개의 명령이 동일한 작업을 수행하기를 원합니다. 적어도 마지막 두 명령은 동일한 작업을 수행합니다.
- 첫 번째 명령은 클라이언트가 연결을 닫을 때 닫히는 간단한 에코 서버로서 예상대로 작동합니다.
- 동작은 1과 유사합니다.
- 서버에 연결하고 데이터를 보낼 수 있지만 응답을 받지 못합니다. 클라이언트 연결을 닫으면 서버가 종료됩니다.
- 서버에 연결할 수 없습니다. 서버가 계속 수신 대기합니다.
답변1
여기서 핵심은 FIFO를 여는 것이 차단 작업이라는 것입니다. open
양쪽 끝이 연결된 경우, 즉 fifo가 읽기 및 쓰기용으로 열린 경우 에만 반환됩니다.
Normally, opening the FIFO blocks until the other end is opened also.
첫 번째 경우, 쉘은 파이프를 실행하기 위해 분기하므로 읽기를 위한 FIFO 열기( cat fifo
)와 쓰기를 위한 FIFO 열기( > fifo
)는 서로 다른 프로세스에서 발생하므로 독립적으로 발생합니다.
두 번째 경우에는 읽기 열기와 쓰기 열기( 3<>fifo
)가 한 단계로 발생합니다.
세 번째 경우 <(cat fifo)
확장자는 파일 이름입니다 /dev/fd/42
. 예를 들어 nc -l localhost 8888 /dev/fd/42 > fifo
. <
동일하게 만들려면 추가 항목이 필요합니다 (예: ) nc -l localhost 8888 < <(cat fifo) > fifo
.
네 번째 경우, 쉘은 동일한 프로세스의 일부로 읽기( < fifo
)를 위해 FIFO를 열고 쓰기( )를 위해 열려고 시도합니다. > fifo
쉘은 왼쪽에서 오른쪽으로 한 번에 하나씩 작업을 수행합니다. 따라서 읽기 위해 열려고 시도 fifo
하고 쓰기 위해 무언가가 열릴 때까지 기다리면서 영원히 차단됩니다 fifo
. 이 경우에는 nc
시작조차 하지 않으며 포트는 수신을 위해 열리지 않는다는 것을 알게 될 것입니다 .