Пример использования именованных каналов в Linux Bash - PullRequest
51 голосов
/ 06 ноября 2010

Может кто-нибудь опубликовать простой пример использования именованных каналов в Bash в Linux?

Ответы [ 4 ]

84 голосов
/ 06 ноября 2010

Один из лучших примеров практического использования именованного канала ...

С http://en.wikipedia.org/wiki/Netcat:

Другое полезное поведение - использование netcat в качестве прокси.Оба порта и хосты могут быть перенаправлены.Посмотрите на этот пример:

nc -l 12345 | nc www.google.com 80

Порт 12345 представляет запрос.

Это запускает сервер nc на порту 12345 и все соединения перенаправляются на google.com:80.Если веб-браузер отправляет запрос на nc, запрос будет отправлен в Google, но ответ не будет отправлен в веб-браузер.Это потому, что трубы однонаправлены.Это можно обойти с помощью именованного канала для перенаправления ввода и вывода.

mkfifo backpipe
nc -l 12345  0<backpipe | nc www.google.com 80 1>backpipe
29 голосов
/ 13 июля 2011

Откройте две разные оболочки и оставьте их рядом.В обоих случаях перейдите в каталог /tmp/:

cd /tmp/

В первом наберите:

mkfifo myPipe
echo "IPC_example_between_two_shells">myPipe

Во втором наберите:

while read line; do echo "What has been passed through the pipe is ${line}"; done<myPipe

Первая оболочка не даст вам никакого приглашения, пока вы не выполните вторую часть кода во второй оболочке.Это потому, что чтение и запись fifo блокирует.

Вы также можете взглянуть на тип FIFO, выполнив ls -al myPipe и посмотреть детали этого конкретного типа файла.

Далеешаг будет заключаться в том, чтобы ввести код в сценарий!

27 голосов
/ 06 ноября 2010

Вот команды:

$ mkfifo named_pipe

$ echo "Hi" > named_pipe &

$ cat named_pipe

Первая команда создает канал.

Вторая команда пишет в канал (блокировка). & помещает это в фоновый режим, чтобы вы могли продолжать вводить команды в той же оболочке Он выйдет, когда FIFO будет освобожден следующей командой.

Последняя команда читает из канала.

2 голосов
/ 28 апреля 2019

Терминал 1:

$ mknod new_named_pipe p
$ echo 123 > new_named_pipe
  • Терминал 1 создал именованный канал.
  • Он записал в него данные, используя echo.
  • Он заблокирован, так как нет принимающей стороны (поскольку каналы, как именованные, так и безымянные, нуждаются в получении и записи в него)

Терминал 2:

$ cat new_named_pipe
$ 123
$ 
  • Из терминала 2 добавляется принимающая сторона для данных.
  • Он читает данные в нем, используя cat.
  • Так как для new_named_pipe имеются как принимающие, так и записывающие стороны, он отображает информацию и остановки блокировки

Именованные каналы используются повсеместно в Linux, большинство файлов char и block, которые мы видим во время команды ls -l, представляют собой символы char и block (все они находятся в / dev). Эти каналы могут быть блокирующими и неблокирующими, и основное преимущество заключается в том, что они обеспечивают самый простой способ для IPC.

...