mkfifo
Что делает команда mkfifo в Linux
Команда mkfifo в Linux используется для создания специальных файлов — именованных каналов (FIFO, First In – First Out). Эти каналы обеспечивают механизм обмена данными между процессами, работающими одновременно. В отличие от обычных файлов, именованные каналы не сохраняют данные на диске — они служат только средством коммуникации.
Когда один процесс записывает данные в FIFO-файл, другой процесс может прочитать эти данные в порядке их записи. Таким образом, команда mkfifo в Linux позволяет организовать межпроцессное взаимодействие без необходимости использовать временные файлы.
FIFO (именованные каналы) отличаются от неименованных каналов тем, что существуют как отдельные объекты в файловой системе и могут быть доступны разным процессам, не связанным родительско-дочерними отношениями.
Основные параметры и синтаксис команды mkfifo
Синтаксис команды
Базовая форма вызова:
mkfifo [опции] имя_файла
После выполнения этой команды создается специальный файл FIFO с указанным именем. Проверить его можно командой ls -l, где в первом столбце прав доступа появится первая буква p (pipe):
prw-r--r-- 1 user user 0 Oct 10 12:00 mypipe
Здесь p указывает, что файл является именованным каналом.
Основные параметры команды mkfifo
- -m, —mode=ПРАВА
Позволяет задать права доступа при создании FIFO.
Пример:mkfifo -m 0660 /tmp/myfifoЗдесь устанавливаются права чтения и записи для владельца и группы, без доступа для остальных. - —help
Выводит краткую справку по использованию команды mkfifo. - —version
Показывает версию утилиты mkfifo, установленной в вашей системе.
Примеры использования команды mkfifo в Linux
Создание и использование FIFO для передачи данных
Рассмотрим пример, как команда mkfifo в Linux применяется для обмена данными между двумя процессами:
- Создаем именованный канал:
mkfifo /tmp/channel - В одном терминале запускаем процесс чтения:
cat < /tmp/channel - В другом терминале записываем данные:
echo "Привет из другого процесса!" > /tmp/channel
В результате первый терминал выведет сообщение:
Привет из другого процесса!
Такой подход часто используется в скриптах и системных задачах, когда необходимо синхронизировать работу нескольких процессов без использования сетевых соединений.
Пример совместного использования с другими утилитами
Команда mkfifo в Linux часто применяется вместе с командами grep, awk, tee, gzip и другими. Например, можно создать конвейер, который будет выполнять обработку данных асинхронно:
mkfifo /tmp/data_pipe
gzip -c < /tmp/data_pipe > backup.gz &
cat largefile.txt > /tmp/data_pipe
В этом примере:
- создается именованный канал
/tmp/data_pipe; - запускается процесс
gzip, который ожидает данные из канала; - команда
catотправляет данные в канал, после чего они сжимаются и сохраняются вbackup.gz.
Работа с правами доступа
Чтобы ограничить доступ к FIFO, можно задать нужные права с помощью параметра -m:
mkfifo -m 0600 secret_pipe
Теперь только владелец сможет читать и записывать в этот канал. Это полезно для защиты данных при обмене между доверенными процессами.
Если нужно изменить права уже созданного канала, можно воспользоваться командой chmod:
chmod 0644 /tmp/channel
Особенности работы именованных каналов
Поведение при чтении и записи
Именованный канал блокирует процесс записи, если нет активного процесса, читающего из него. Аналогично, процесс чтения будет ожидать, пока кто-то не начнет запись. Это поведение гарантирует синхронизацию и предотвращает потерю данных.
Если необходимо избежать блокировки, можно открыть канал с флагом O_NONBLOCK, например в языке C или через bash с использованием dd:
dd if=/tmp/channel of=/dev/null iflag=nonblock
[ ! -p /tmp/myfifo ] && mkfifo /tmp/myfifo
Использование mkfifo в скриптах
Команда mkfifo в Linux часто встречается в shell-скриптах, особенно для организации очередей данных или логирования. Например:
#!/bin/bash
PIPE=/tmp/logpipe
[ ! -p $PIPE ] && mkfifo $PIPE
# Процесс записи логов
cat $PIPE >> system.log &
LOGGER_PID=$!
# Генерация сообщений
for i in {1..5}; do
echo "Сообщение $i" > $PIPE
done
kill $LOGGER_PID
rm $PIPE
В этом сценарии сообщения записываются через FIFO в файл system.log, что позволяет гибко управлять потоками данных.
Преимущества использования команды mkfifo в Linux
- Снижение нагрузки на диск.
Данные не сохраняются физически, а передаются напрямую между процессами. - Гибкость.
FIFO можно использовать для взаимодействия между любыми программами, независимо от их происхождения. - Простота интеграции.
Команда легко включается в shell-скрипты, cron-задачи и системные сервисы. - Контроль доступа.
Возможность установки прав через-mделает обмен данными безопасным.
Заключительные рекомендации
- Совет: если FIFO больше не используется, удаляйте его вручную, чтобы избежать засорения
/tmp.rm /tmp/channel - Используйте команду mkfifo в Linux вместе с
systemdилиcron, если нужно настроить постоянный канал обмена между фоновыми сервисами. - Проверяйте состояние каналов при отладке с помощью
ls -lиfile, чтобы убедиться, что объект действительно является FIFO:file /tmp/channel # /tmp/channel: fifo (named pipe)
Команда mkfifo в Linux — это мощный инструмент для организации взаимодействия процессов без использования временных файлов и лишней нагрузки на файловую систему. Владение этой командой важно для системных администраторов, DevOps-инженеров и разработчиков, работающих с автоматизацией и обработкой потоков данных.