명명된 파이프로의 파일 리디렉션은 작동하지 않지만 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

표준 입력으로 읽고 쓰기 위해 fifo를 연 다음 이를 표준 출력으로 복사합니다.


완전한 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를 열 때까지 차단되거나 그 반대의 경우도 마찬가지입니다.

관련 정보