Это простой эхо-сервер в 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
команду localhost
on, 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 для записи, и наоборот.