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

Вот решение с помощью a for цикл и арифметика удара:

i=1
for file in ??-??-??.png ; do
    mv "$file" $i.png
    let i++
done
53
25.03.2013, 16:22
4 ответа

Именованные каналы (первым прибыл, первым обслужен) имеют четыре три преимущества, о которых я могу думать:

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

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

(Обновленный, благодаря обратной связи от Stephane Chazelas)

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

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

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

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

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

40
27.01.2020, 19:33
  • 1
    у Вас может быть несколько читателей/устройств записи с каналами без имени также. На Linux они не больше двунаправлены, чем канал неАмеда. Существует конец записи и конец чтения и потоки данных в одном направлении только. При открытии FIFO в режиме записи Вы получаете конец записи, в режиме чтения конец чтения, в rw режиме, Вы пишете в конец записи и чтение от чтения. Это отличается от двунаправленных каналов или сокетов домена Unix, где у Вас на самом деле есть два отдельных потока данных в каждом направлении. –  Stéphane Chazelas 25.03.2013, 23:03
  • 2
    @StephaneChazelas благодарит за обратную связь, я обновил ответ, чтобы быть более конкретным, и разъясниться (я надеюсь), каналы и направленность. –  mr.spuratic 26.03.2013, 01:03
  • 3
    Коммуникация к именованному каналу включают диск IO? Или действительно ли все это в оперативной памяти? Что определяет конверт производительности этих механизмов IPC? –  CMCDragonkai 01.05.2015, 05:41

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

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

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

15
27.01.2020, 19:33
  • 1
    +1 я думаю процессы в значительной степени всегда, существует одновременно (иначе, канал немного бессмыслен - Вы могли бы также просто оставить материал в регулярном файле). Они и сокеты домена Unix часто используются сервисами демона, которыми можно управлять, например, из командной строки. Если Вы заглядываете /run в настольной системе Linux Вы, вероятно, найдете несколько из (названными fifos и сокетами Unix). Это - форма IPC. –  goldilocks 25.03.2013, 14:10
  • 2
    @goldilocks: именованный канал является наиболее часто используемым как резидентный специальный почтовый ящик между процессами во встроенных системах, где коммуникационные процессы являются недолгими и не существуют одновременно. Преимуществом является простота реализации по сравнению с общей памятью IPC и то, что только RAM используется. Недостаток является неперсистентностью между начальными загрузками и мудрой байтом природой FIFO канала по сравнению со способностью использовать структуру с общей памятью. –  Jonathan Ben-Avraham 25.03.2013, 14:31
  • 3
    @jonathan: +1, у меня есть некоторые сомнения:-, почему делают мы отсылаем именованные каналы как FIFO; что такое персистентные объекты? –  Ankit 25.03.2013, 18:23
  • 4
    @Ankit: Некоторые люди называют именованный канал FIFO, потому что он ведет себя как структура данных FIFO, особенно при открытии и для чтения и для записи единственным процессом. "Постоянным объектом" я подразумевал, что именованный канал связан с объектом файловой системы. Таким образом, это - тип файла с именем, и это имеет ту же персистентность как любой другой файл, хранивший на медиа. –  Jonathan Ben-Avraham 26.03.2013, 19:26

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

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

4
27.01.2020, 19:33
  • 1
    Интересный. У Вас есть такое приложение? Кажется, что это должно было бы смотреть на уровне ядра для наблюдения, когда к FIFO получали доступ. –  Wildcard 19.04.2016, 05:34

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

4
27.01.2020, 19:33

Теги

Похожие вопросы