이 네 가지 명령(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가 읽기 및 쓰기 모두에 대해 열린 경우에만 반환됩니다 .

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

관련 정보