Каковы преимущества использования именованного канала над неназванным?


51

Я просматривал набор вопросов для интервью, задаваемых администратором Unix; Я нашел тему под названием "именованная труба".

Я погуглил тему; в какой-то степени я смог понять это: - именованные каналы || ФИФО

Но все же я чувствую, что мне не хватает знаний о том, когда использовать этот конкретный тип трубы. Существуют ли какие-либо особые ситуации, когда неназванные каналы не работают?


Другая ссылка на техническом форуме: writeulearn.com/category/inter-process-communicationipc

Ответы:


39

Именованные каналы (fifo) имеют четыре следующих преимущества:

  • Вам не нужно начинать процесс чтения / записи одновременно
  • Вы можете иметь несколько читателей / писателей, которые не нуждаются в общем происхождении
  • в виде файла вы можете контролировать владение и разрешения
  • они двунаправленные, безымянные трубы могут быть однонаправленными *

    *) Подумайте о стандартной оболочки |трубопровода , который является однонаправленным, несколько оболочек ( ksh, zshи bash) также предлагают coprocesses , которые позволяют двунаправленную связь. POSIX рассматривает каналы как полудуплекс (то есть каждая сторона может только читать или писать), pipe()системный вызов возвращает два дескриптора файла, и вам может потребоваться обрабатывать один как только для чтения, а другой как только для записи. Некоторые (BSD) системы поддерживают чтение и запись одновременно (не запрещено POSIX), в других вам понадобятся два канала, по одному для каждого направления. Проверьте ваши pipe(), popen()и , возможно , popen2()человек страниц. Направленность может не зависеть от того, назван ли канал или нет, хотя в Linux 2.6 это зависит.

(Обновлено, благодаря отзывам Стефана Шазеля )

Итак, одна очевидная задача, которую вы не можете решить с помощью неназванного канала, - это обычное клиент-серверное приложение.

Последний (ошеломленный) пункт выше об однонаправленных каналах имеет отношение к Linux, POSIX (см. popen()) Говорит, что каналы должны быть только читаемыми или записываемыми , в Linux они являются однонаправленными . См. Понимание ядра Linux (3-е изд. О'Рейли) для деталей, специфичных для Linux (p787). Другие ОС предлагают двунаправленные (безымянные) каналы.

Например, Nagios использует fifo для своего командного файла . Различные внешние процессы (CGI-скрипты, внешние проверки, NRPE и т. Д.) Пишут команды / обновления для этого fifo, и они обрабатываются постоянным процессом Nagios.

Именованные каналы имеют особенности, не похожие на TCP-соединения, но есть важные отличия. Поскольку у fifo есть постоянное имя файловой системы, вы можете писать в него, даже когда нет читателя, по общему признанию, записи будут блокироваться (без асинхронного или неблокирующего ввода / вывода), хотя вы не потеряете данные, если получатель не запущен (или перезапускается).

Для справки см. Также доменные сокеты Unix и ответ на этот вопрос Stackoverflow, в котором кратко описаны основные методы IPC , и этот, в котором говорится оpopen()


2
Вы также можете иметь несколько читателей / писателей с неназванными каналами. В Linux они не более двунаправлены, чем неиспользуемые каналы. Есть конец записи и конец чтения, и данные передаются только в одном направлении. Когда вы открываете fifo в режиме записи, вы получаете конец записи, в режиме чтения - конец чтения, в режиме rw - запись в конец записи и чтение из чтения. Это отличается от двунаправленных каналов или доменных сокетов Unix, где у вас фактически есть два отдельных потока данных в каждом направлении.
Стефан Шазелас

@StephaneChazelas спасибо за отзыв, я обновил ответ, чтобы быть более конкретным, и прояснить (я надеюсь) каналы и направленность.
mr.spuratic

Включает ли связь с именованным каналом дисковый ввод-вывод? Или это все в памяти? От чего зависит производительность этих механизмов IPC?
CMCDragonkai

15

Неназванные или анонимные каналы предоставляют возможность одностороннего межпроцессного взаимодействия между различными процессами, которые связаны либо отношениями родитель-потомок, либо являются потомками общего родителя, который предоставляет канал, такого как оболочка процесс. Поскольку процессы связаны, ассоциация файловых дескрипторов с каналом может быть неявной и не требует объекта с именем, которое является внешним для процессов. Канал без имени существует только до тех пор, пока процессы, которые его используют, поддерживают дескрипторы открытых файлов для канала. Когда процессы завершаются, и ОС закрывает все файловые дескрипторы, связанные с процессами, безымянный канал закрывается.

Названные трубы на самом деле являются FIFO. Это постоянные объекты, представленные узлами в файловой системе. Именованный канал обеспечивает двустороннюю связь «многие ко многим» между одним или несколькими процессами, которые не обязательно связаны и не должны существовать одновременно. Имя файла канала служит адресом или контрактом между процессами для связи. Если только один процесс выполняет запись в именованный канал, а другой - из именованного канала, то именованный канал ведет себя так же, как и неназванный канал между двумя связанными процессами.

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


+1 Я думаю, что процессы почти всегда существуют в одно и то же время (иначе труба немного бессмысленна - вы могли бы просто оставить материал в обычном файле). Эти сокеты и доменные сокеты Unix часто используются сервисами демонов, которыми можно управлять, например, из командной строки. Если вы загляните в /runнастольную систему Linux, вы, вероятно, найдете несколько из них (названные fifos и unix sockets). Это форма МПК .
Златовласка

2
@goldilocks: именованный канал обычно используется в качестве резидентного специального почтового ящика между процессами во встроенных системах, где процессы обмена данными являются кратковременными и не существуют одновременно. Преимущество - простота реализации по сравнению с IPC с общей памятью и тот факт, что используется только оперативная память. Недостатком является непостоянство между загрузкой и байтовой природой FIFO канала по сравнению с возможностью использовать структуру с общей памятью.
Джонатан Бен-Авраам

@jonathan: +1, у меня есть некоторые сомнения: - почему мы называем именованные каналы как FIFO; Что такое постоянные объекты?
Анкит

@Ankit: Некоторые люди называют именованный канал FIFO, потому что он ведет себя как структура данных FIFO, особенно когда он открыт для чтения и записи одним процессом. Под «постоянным объектом» я подразумевал, что именованный канал связан с объектом файловой системы. То есть это тип файла с именем, и он имеет такое же постоянство, как и любой другой файл, хранящийся на носителе.
Джонатан Бен-Авраам

4

Одно преимущество, не упомянутое где-либо еще, состоит в том, что именованный канал может использоваться в местах, где подойдет только файл.

Например, некоторые почтовые клиенты имеют функцию добавления содержимого ~ / .signature к каждому почтовому сообщению. Если бы .signature был параметром командной строки или если почтовый клиент мог заметить, что .signature является исполняемым и запустить его, то вам не понадобился бы именованный канал. Но если почтовый клиент не такой сложный, вы можете создать именованный канал с именем .signature и запустить приложение, которое генерирует новую подпись каждый раз, когда файл читается.


Интересно. У вас есть такое приложение? Кажется, на уровне ядра нужно было бы посмотреть, когда происходит доступ к FIFO.
Wildcard

4

Есть еще одно преимущество именованных каналов: вы можете использовать их в разных системах . Предположим, вы хотите в режиме реального времени общаться двух процессов, запущенных на разных машинах. Затем поделитесь папкой между ними, поместите свой FIFO в папку и начинайте. Это значительно проще, чем преобразование приложения, предназначенного для работы с файлами, в службу, прослушивающую порт.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.