Я просматривал набор вопросов для интервью, задаваемых администратором Unix; Я нашел тему под названием "именованная труба".
Я погуглил тему; в какой-то степени я смог понять это: - именованные каналы || ФИФО
Но все же я чувствую, что мне не хватает знаний о том, когда использовать этот конкретный тип трубы. Существуют ли какие-либо особые ситуации, когда неназванные каналы не работают?
Ответы:
Именованные каналы (fifo) имеют
четыре следующихпреимущества:они двунаправленные, безымянные трубы могут быть однонаправленными*(Обновлено, благодаря отзывам Стефана Шазеля )
Итак, одна очевидная задача, которую вы не можете решить с помощью неназванного канала, - это обычное клиент-серверное приложение.
Последний (ошеломленный) пункт выше об однонаправленных каналах имеет отношение к Linux, POSIX (см.
popen()
) Говорит, что каналы должны быть только читаемыми или записываемыми , в Linux они являются однонаправленными . См. Понимание ядра Linux (3-е изд. О'Рейли) для деталей, специфичных для Linux (p787). Другие ОС предлагают двунаправленные (безымянные) каналы.Например, Nagios использует fifo для своего командного файла . Различные внешние процессы (CGI-скрипты, внешние проверки, NRPE и т. Д.) Пишут команды / обновления для этого fifo, и они обрабатываются постоянным процессом Nagios.
Именованные каналы имеют особенности, не похожие на TCP-соединения, но есть важные отличия. Поскольку у fifo есть постоянное имя файловой системы, вы можете писать в него, даже когда нет читателя, по общему признанию, записи будут блокироваться (без асинхронного или неблокирующего ввода / вывода), хотя вы не потеряете данные, если получатель не запущен (или перезапускается).
Для справки см. Также доменные сокеты Unix и ответ на этот вопрос Stackoverflow, в котором кратко описаны основные методы IPC , и этот, в котором говорится о
popen()
источник
Неназванные или анонимные каналы предоставляют возможность одностороннего межпроцессного взаимодействия между различными процессами, которые связаны либо отношениями родитель-потомок, либо являются потомками общего родителя, который предоставляет канал, такого как оболочка процесс. Поскольку процессы связаны, ассоциация файловых дескрипторов с каналом может быть неявной и не требует объекта с именем, которое является внешним для процессов. Канал без имени существует только до тех пор, пока процессы, которые его используют, поддерживают дескрипторы открытых файлов для канала. Когда процессы завершаются, и ОС закрывает все файловые дескрипторы, связанные с процессами, безымянный канал закрывается.
Названные трубы на самом деле являются FIFO. Это постоянные объекты, представленные узлами в файловой системе. Именованный канал обеспечивает двустороннюю связь «многие ко многим» между одним или несколькими процессами, которые не обязательно связаны и не должны существовать одновременно. Имя файла канала служит адресом или контрактом между процессами для связи. Если только один процесс выполняет запись в именованный канал, а другой - из именованного канала, то именованный канал ведет себя так же, как и неназванный канал между двумя связанными процессами.
Таким образом, короткий ответ заключается в том, что вам нужен именованный канал для связи между несвязанными процессами, которые могут не существовать одновременно.
источник
/run
настольную систему Linux, вы, вероятно, найдете несколько из них (названные fifos и unix sockets). Это форма МПК .Одно преимущество, не упомянутое где-либо еще, состоит в том, что именованный канал может использоваться в местах, где подойдет только файл.
Например, некоторые почтовые клиенты имеют функцию добавления содержимого ~ / .signature к каждому почтовому сообщению. Если бы .signature был параметром командной строки или если почтовый клиент мог заметить, что .signature является исполняемым и запустить его, то вам не понадобился бы именованный канал. Но если почтовый клиент не такой сложный, вы можете создать именованный канал с именем .signature и запустить приложение, которое генерирует новую подпись каждый раз, когда файл читается.
источник
Есть еще одно преимущество именованных каналов: вы можете использовать их в разных системах . Предположим, вы хотите в режиме реального времени общаться двух процессов, запущенных на разных машинах. Затем поделитесь папкой между ними, поместите свой FIFO в папку и начинайте. Это значительно проще, чем преобразование приложения, предназначенного для работы с файлами, в службу, прослушивающую порт.
источник