이 네 가지 명령(fifo, 프로세스 교체, 리디렉션...)의 차이점은 무엇입니까?

이 네 가지 명령(fifo, 프로세스 교체, 리디렉션...)의 차이점은 무엇입니까?

내 목표는 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. 첫 번째 명령은 클라이언트가 연결을 닫을 때 닫히는 간단한 에코 서버로서 예상대로 작동합니다.
  2. 동작은 1과 유사합니다.
  3. 서버에 연결하고 데이터를 보낼 수 있지만 응답을 받지 못합니다. 클라이언트 연결을 닫으면 서버가 종료됩니다.
  4. 서버에 연결할 수 없습니다. 서버가 계속 수신 대기합니다.

답변1

여기서 핵심은 FIFO를 여는 것이 차단 작업이라는 것입니다. open양쪽 끝이 연결된 경우, 즉 fifo가 읽기 및 쓰기용으로 열린 경우 에만 반환됩니다.

남자가 먼저 들어오고 나가는 것 (7)

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시작조차 하지 않으며 포트는 수신을 위해 열리지 않는다는 것을 알게 될 것입니다 .

관련 정보