Команда mkfifo позволяет задействовать одноименную утилиту, предназначенную для создания именованных программных каналов. Программные каналы предназначены для обмена данными между приложениями (или в рамках одного приложения) и представляют собой буферы в памяти, поддерживающие операции чтения и записи с блокировками. Как вы уже наверняка поняли, данная команда не является самой востребованной, тем не менее, она может использоваться в определенных случаях. Вообще она очень похожа на оператор |, предназначенный для создания конвейеров с использованием неименованных каналов. Это объясняется тем, что именованный канал отличается от неименованного лишь связанным с ним файлом специального типа с заданным пользователем именем.
Базовый синтаксис команды выглядит следующим образом:
$ mkfifo [параметры] имя-файла
Команда может принимать имя файла именованного канала, а также ряд параметров. Единственным актуальным для обычного пользователя параметром является параметр -m, позволяющий задать права доступа к файлу.
Для передачи данных через именованный канал в первую очередь создать этот канал с помощью команды mkfifo:
$ mkfifo /tmp/my.fifo
$ ls -al /tmp
итого 12
drwxrwxrwt 22 root root 4096 янв 26 18:42 .
drwxr-xr-x 19 root root 276 окт 28 04:50 ..
srwxrwxrwx 1 alex alex 0 янв 26 17:44 dbus-LsFsgVPv7w
drwxrwxrwt 2 root root 6 янв 26 17:43 .font-unix
-rw------- 1 alex alex 0 янв 26 17:44 gdm3-config-err-DvSZB2
drwxrwxrwt 2 root root 30 янв 26 17:44 .ICE-unix
drwx------ 2 alex alex 30 янв 26 18:38 lu7147vowvnx.tmp
prw-rw-r-- 1 alex alex 0 янв 26 18:42 my.fifo
drwx------ 2 alex alex 52 янв 26 17:56 .org.chromium.Chromium.0MwE05
...
Файл именованного программного канала несложно обнаружить в выводе команды ls. Вы наверняка заметили, что наш файл программного канала my.fifo имеет нулевой размер, а в связанной с ним строке прав доступа первым символом является символ p (pipe — программный канал).
Теперь можно начинать обмен данными между приложениями. Для этого следует открыть дополнительное окно эмулятора терминала и выполнить в нем команду для чтения данных из файла программного канала:
$ tail -f /tmp/my.fifo
Исполнение команды заблокируется до поступления данных в программный канал.
Далее следует выполнить с помощью первого окна эмулятора терминала команду для записи данных в файл программного канала:
$ echo "hello" >> /tmp/my.fifo
После записи данных в файл канала следует снова открыть второе окно эмулятора терминала и оценить результат. Утилита tail прочитает переданную в программный канал строку «hello» и продолжит ожидать поступления данных.
$ tail -f /tmp/my.fifo
hello
Для того, чтобы прервать ее работу, достаточно воспользоваться сочетанием клавиш Ctrl+C.
После окончания использования файла программного канала следует удалить его с помощью команды unlink:
$ unlink /tmp/my.fifo
Разумеется, с помощью именованных каналов можно выполнять и более продуктивную работу. В любом случае, принцип работы рассмотренного механизма останется прежним.