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