Что такое именованные каналы?

Ответы:

153

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

Так же, как у вас есть сервер, который прослушивает IP-адрес / порт для входящих запросов, сервер также может настроить именованный канал, который может прослушивать запросы. В любом случае клиентский процесс (или библиотека доступа к БД) должен знать конкретный адрес (или имя канала) для отправки запроса. Часто существует обычно используемое стандартное значение по умолчанию (как и порт 80 для HTTP, SQL-сервер использует порт 1433 в TCP / IP; \\. \ Pipe \ sql \ query для именованного канала).

Настроив дополнительные именованные каналы, вы можете иметь несколько запущенных серверов БД, каждый со своими слушателями запросов.

Преимущество именованных каналов в том, что они обычно намного быстрее и освобождают ресурсы сетевого стека.

- Кстати, в мире Windows вы также можете иметь именованные каналы для удаленных машин, но в этом случае именованный канал транспортируется по TCP / IP, поэтому вы потеряете производительность. Используйте именованные каналы для обмена данными на локальном компьютере.

Toybuilder
источник
1
В чем недостаток?
lindhe
2
@lindhe Нет автоматической работы по сети. Обычно сложнее настроить на практике. Реализация в Windows отличается от реализации в Unix / Unix-подобных системах. Они классные, но я бы не стал беспокоиться, если производительность не является обязательной.
sudo
43

В Unix и Windows есть вещи, называемые «именованными каналами», но они ведут себя по-разному. В Unix именованный канал - это улица с односторонним движением, на которой обычно есть только один читатель и один писатель: писатель пишет, а читатель читает, вы понимаете?

В Windows объект, называемый «Именованный канал», является объектом IPC, больше похожим на сокет TCP - все может передаваться в обе стороны, и есть некоторые метаданные (вы можете получить учетные данные объекта на другом конце и т. Д.).

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

Еще больше сбивает с толку то, что в Unix есть нечто, называемое «сокетом Unix» или сокетом AF_UNIX, которое больше похоже (но не полностью похоже) на «именованный канал» win32, будучи двунаправленным.

MarkR
источник
23


Механизм межпроцессного взаимодействия Linux Pipes First In First Out (FIFO).

Каналы без названия
В командной строке, представленные знаком «|» между двумя командами.

Именованные
каналы. Специальный файл FIFO. После создания вы можете использовать канал как обычный файл (открывать, закрывать, писать, читать и т. Д.).

Чтобы создать именованный канал с именем «myPipe» из командной строки ( страница руководства ):

mkfifo myPipe  

Чтобы создать именованный канал из c, где "pathname" - это имя, которое вы хотите, чтобы канал имел, а "mode" содержит разрешения, которые вы хотите, чтобы канал имел ( страница руководства ):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
Джон Малдер
источник
2
«вы можете использовать пайп как обычный файл» - не совсем так. Нельзя ни tell()позиционировать, ни seek()в трубе.
nyov
19

Согласно Википедии :

[...] Традиционный канал "безымянный", потому что он существует анонимно и сохраняется только до тех пор, пока выполняется процесс. Именованный канал является постоянным в системе и существует после истечения срока действия процесса и должен быть «отсоединен» или удален, как только он больше не используется. Процессы обычно подключаются к именованному каналу (обычно представляющемуся в виде файла) для выполнения IPC (межпроцессного взаимодействия).

Джонатан Лоновски
источник
12

сравнить

echo "test" | wc

в

mkdnod apipe p
wc apipe

туалет будет заблокирован до тех пор, пока

echo "test" > apipe

исполняет

Джон Нильссон
источник
7

Каналы - это способ потоковой передачи данных между приложениями. Под Linux я все время использую это для потоковой передачи вывода одного процесса в другой. Это анонимно, потому что целевое приложение не знает, откуда приходит этот входной поток. Это не нужно.

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

Oli
источник
6

Это эксперт от Technet (поэтому не уверен, почему отмеченный ответ говорит, что именованные каналы быстрее?):

Именованные каналы против сокетов TCP / IP

В среде быстрой локальной сети (LAN) сокеты протокола управления передачей / Интернет-протокола (TCP / IP) и клиенты именованных каналов сопоставимы по производительности. Однако разница в производительности между клиентами TCP / IP Sockets и Named Pipes становится очевидной в более медленных сетях, например в глобальных сетях (WAN) или в сетях удаленного доступа. Это происходит из-за различных способов взаимодействия механизмов межпроцессного взаимодействия (IPC) между одноранговыми узлами.

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

Также важно уточнить, идет ли речь о локальных или сетевых трубопроводах. Если серверное приложение выполняется локально на компьютере, на котором работает экземпляр SQL Server, можно использовать локальный протокол именованных каналов. Локальные именованные каналы работают в режиме ядра и работают очень быстро.

Для сокетов TCP / IP передача данных более упрощена и требует меньше накладных расходов. При передаче данных также могут использоваться механизмы повышения производительности сокетов TCP / IP, такие как управление окнами, отложенные подтверждения и т. Д. Это может быть очень полезно в медленной сети. В зависимости от типа приложений такие различия в производительности могут быть значительными.

Сокеты TCP / IP также поддерживают очередь невыполненных работ. Это может обеспечить ограниченный эффект сглаживания по сравнению с именованными каналами, что может привести к ошибкам занятости канала при попытке подключения к SQL Server.

Как правило, TCP / IP предпочтительнее в медленных LAN, WAN или коммутируемых сетях, тогда как именованные каналы могут быть лучшим выбором, когда скорость сети не является проблемой, поскольку они предлагают больше функциональных возможностей, простоты использования и параметров конфигурации.

Ness
источник
5

Межпроцессное взаимодействие (в основном) для приложений Windows. Подобно использованию сокетов для связи между приложениями в Unix.

MSDN

кругозор
источник
4
Именованные каналы появились в V6 или AT&T Unix примерно в 1975 году.
dmckee --- котенок экс-модератора
Doh! Это немного раньше Microsoft. Насколько мне известно, они нечасто используются в приложениях Unix / Linux. Правда?
Кен
Я использую именованный канал для своего генератора случайных подписей - поскольку приложения почты и usenet ожидают, что файл с именем $ HOME / .signature будет иметь вашу подпись, моя программа создает .signature как именованный канал и записывает в него случайные цитаты.
Пол Томблин,
3

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

Более того, один сценарий, дважды созданный в одной оболочке, не может использовать что-либо совместно с двумя экземплярами. Я нашел применение именованным каналам при кодировании демона, содержащего функции start () и stop (), и хотел использовать один и тот же сценарий для выполнения этих двух действий.

Без именованных каналов (или любого семафора) запуск скрипта в фоновом режиме не является проблемой. Дело в том, что когда он завершится, вы просто не сможете получить доступ к экземпляру в фоновом режиме.

Поэтому, когда вы хотите отправить ему команду остановки, вы просто не можете: запуск того же сценария без именованных каналов и вызов функции stop () ничего не даст, поскольку вы фактически запускаете другой экземпляр.

Решением было реализовать два канала, один READ и другой WRITE при запуске демона. Затем заставьте его, среди других его задач, слушать трубку READ. Затем функция Stop () содержит команду, которая запишет сообщение в конвейер, которое будет обрабатываться фоновым скриптом, который выполнит выход 0. Таким образом, наш второй экземпляр того же скрипта имеет только одну задачу: скажите первому экземпляру остановиться.

Таким образом, один и только один скрипт может запускаться и останавливаться.

Конечно, у вас есть разные способы сделать это, например, активировав стоп одним касанием. Но этот красивый и интересный для программирования.

Николас Мас
источник
1

Именованные каналы - это система Windows для межпроцессного взаимодействия. В случае SQL-сервера, если сервер находится на том же компьютере, что и клиент, можно использовать именованные каналы для передачи данных, в отличие от TCP / IP.

eulerfx
источник
Это не только для Windows, как кажется из вашего ответа. Как уже отмечали другие, именованные каналы существуют в UNIX с 70-х годов, как правило, как особый файл. В любом случае проголосовали за, но исправьте свой ответ.
Крис Чарабарук,