Почему перенаправление файлов в именованный канал и из него не работает, а перенаправление в cat работает?

Почему перенаправление файлов в именованный канал и из него не работает, а перенаправление в cat работает?

Это простой эхо-сервер в Unix, использующий nc:

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команду localhoston, 4458вы получите сообщение об ошибке «Подключение отклонено».

решение1

Это потому, что команда netcat еще даже не запущена! Оболочка при попытке открыть fifo для ввода заблокируется. Попробуйте

strace cat >fifo <fifo

и вы ничего не увидите. Вместо этого используйте, например,

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

который открывает fifo для чтения и записи как stdin, а затем дублирует его в 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 для записи, и наоборот.

Связанный контент