Почти все в Linux можно считать файлом , но основное различие между обычным файлом и именованным каналом заключается в том, что именованный канал - это особый экземпляр файла, который не имеет содержимого в файловой системе.
Вот цитата из man fifo
:
Специальный файл FIFO (именованный канал) похож на канал, за исключением того, что он доступен как часть файловой системы. Его можно открыть несколькими процессами для чтения или записи. Когда процессы обмениваются данными через FIFO, ядро передает все данные внутренне, не записывая их в файловую систему. Таким образом, специальный файл FIFO не имеет содержимого в файловой системе; запись файловой системы просто служит контрольной точкой, так что процессы могут получить доступ к каналу, используя имя в файловой системе.
Ядро поддерживает ровно один объект канала для каждого специального файла FIFO, который открывается как минимум одним процессом. FIFO должен быть открыт с обоих концов (чтение и запись), прежде чем данные могут быть переданы. Как правило, открытие блоков FIFO до открытия другого конца также.
Так что на самом деле именованный канал ничего не делает, пока какой-то процесс не читает и не пишет в него. Он не занимает места на жестком диске (кроме небольшого количества мета-информации), он не использует процессор.
Вы можете проверить это, выполнив это:
Создать именованный канал
$ mkfifo /tmp/testpipe
Перейдите, например /home/user/Documents
, к какому-либо каталогу и распакуйте все внутри него, используя именованный канал.
$ 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
адреса или прослушивания какого-либо порта.