명명된 파이프와의 파일 리디렉션은 작동하지 않지만 cat으로의 파이핑은 작동하는 이유는 무엇입니까?

명명된 파이프와의 파일 리디렉션은 작동하지 않지만 cat으로의 파이핑은 작동하는 이유는 무엇입니까?

이것은 nc를 사용하는 Unix의 간단한 에코 서버입니다.

mkfifo fifo
cat fifo | nc -k -l 4458 -v | cat >fifo

(기준으로이것)

내가 볼 수 있듯이 데이터 흐름은 다음과 같이 작동합니다.

fifo (my named pipe)
 |
 | (using cat)
 |
 v
nc
 |
 | (using cat)
 |
 v
fifo 

그리고 여기에 질문이 있습니다. 왜 이것이 작동하지 않습니까?

nc -k -l 4458 -v >fifo <fifo

telnet연결을 localhost시도 하면 4458"연결이 거부되었습니다"라는 오류가 발생한다는 것을 알 수 있습니다.

답변1

이는 netcat 명령이 아직 시작되지 않았기 때문입니다! 입력을 위해 FIFO를 열려고 하면 쉘이 차단됩니다. 노력하다

strace cat >fifo <fifo

그리고 당신은 아무것도 볼 수 없습니다. 대신 다음을 사용하세요.

nc -k -l 4458 -v <>fifo >&0

stdin으로 읽고 쓰기 위해 fifo를 연 다음 stdout으로 복사합니다.


전체 bash 명령을 추적하면 읽기 또는 쓰기를 위한 열기가 반환되지 않음을 알 수 있습니다(반대 열기가 완료될 때까지).

$ strace -f -e open bash -c 'nc -k -l 4458 -v  >fifo <fifo'
...
Process 3631 attached
[pid  3631] open("fifo", O_WRONLY|O_CREAT|O_TRUNC, 0666

$ strace -f -e open bash -c 'nc -k -l 4458 -v  <fifo >fifo'
...
Process 3684 attached
[pid  3684] open("fifo", O_RDONLY

man 3 mkfifo: 읽기를 위해 FIFO를 여는 것은 다른 프로세스가 쓰기를 위해 동일한 FIFO를 열 때까지 정상적으로 차단되며 그 반대의 경우도 마찬가지입니다.

관련 정보