Практично все в Linux можна вважати файлом , але головна відмінність звичайного файлу від іменованого каналу полягає в тому, що названа труба - це особливий екземпляр файлу, який не містить вмісту у файловій системі.
Ось цитата з man fifo
:
Спеціальний файл FIFO (названа труба) схожий на трубу, за винятком того, що до нього доступ є частиною файлової системи. Він може бути відкритий декількома процесами для читання чи письма. Коли процеси обмінюються даними через FIFO, ядро передає всі дані внутрішньо, не записуючи їх у файлову систему. Таким чином, спеціальний файл FIFO не містить вмісту у файловій системі; запис файлової системи служить лише опорною точкою, щоб процеси могли отримати доступ до труби, використовуючи ім'я у файловій системі.
Ядро підтримує рівно один об'єкт труб для кожного спеціального файлу FIFO, який відкривається щонайменше одним процесом. FIFO має бути відкрито з обох кінців (читання та запис), перш ніж передавати дані. Як правило, також відкриваються блоки FIFO, поки не відкриється інший кінець.
Тож фактично названа труба нічого не робить, поки якийсь процес не прочитає і не запише її. Він не займає місця на жорсткому диску (за винятком трохи метаінформації), він не використовує процесор.
Ви можете перевірити це, зробивши це:
Створіть названу трубу
$ mkfifo /tmp/testpipe
Наприклад /home/user/Documents
, перейдіть до якогось каталогу і gzip все, що знаходиться всередині нього, використовуючи названий pipe.
$ cd /home/user/Documents
$ tar cvf - . | gzip > /tmp/testpipe &
[1] 28584
Тут ви повинні побачити PID процесу gzip. У нашому прикладі це було 28584.
Тепер перевірте, що робить цей PID
$ ps u -P 28584
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
c0rp 28584 0.0 0.0 29276 7800 pts/8 S 00:08 0:00 bash
Ви побачите, що він не використовує ніяких ресурсів . 0% використання процесора, 0% використання пам'яті.
Перевірте переконання щодо використання файлового простору
$ du -h /tmp/testpipe
0 testpipe
І знову 0
нічого. При необхідності тест-трубу можна буде використовувати знову.
Не забудьте вбити gzip, використовуючи kill -15 28584
. І видаліть нашу названу трубу за допомогоюrm /tmp/testpipe
Приклади використання
Ви можете перенаправити майже все, використовуючи названий патрубок. Як приклад ви можете бачити цей однорядковий проксі .
Також тут є ще одне приємне пояснення використання названих труб. Ви можете налаштувати два процеси на одному сервері для спілкування за допомогою іменованого каналу замість стеку TCP / IP. Це набагато швидше і не завантажує мережеві ресурси. Наприклад, ваш веб-сервер може спілкуватися з базою даних безпосередньо за допомогою названого каналу, а не використовувати localhost
адресу чи прослуховувати якийсь порт.