Команда mkfifo

Команда 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

Разумеется, с помощью именованных каналов можно выполнять и более продуктивную работу. В любом случае, принцип работы рассмотренного механизма останется прежним.