Может ли кто-нибудь опубликовать простой пример использования именованных каналов в Bash в Linux?
Пример использования именованных каналов в Linux Bash
Ответ 1
Один из лучших примеров практического использования именованной трубы...
С 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
Ответ 2
Откройте две разные оболочки и оставьте их рядом. В обоих случаях перейдите в каталог /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
и посмотреть детали этого конкретного типа файла.
Следующим шагом будет внедрение кода в скрипт!
Ответ 3
Вот команды:
$ mkfifo named_pipe
$ echo "Hi" > named_pipe &
$ cat named_pipe
Первая команда создает канал.
Вторая команда записывает в канал (блокирование). &
помещает это в фоновый режим, поэтому вы можете продолжать вводить команды в одной и той же оболочке. Он выйдет, когда FIFO будет опустошен следующей командой.
Последняя команда читается из канала.
Ответ 4
Терминал 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
являются ls -l
char и block (все они находятся в /dev). Эти каналы могут быть блокирующими и неблокирующими, и основное преимущество заключается в том, что они обеспечивают самый простой способ для IPC.