Як називають труби?


Відповіді:


153

Як у Windows, так і в системах POSIX, іменовані канали забезпечують спосіб міжпроцесорної комунікації між процесами, що працюють на одній машині. Те, що називають трубами, - це спосіб надсилати свої дані, не маючи покарання за ефективність використання мережевого стеку.

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

Налаштувавши додаткові іменовані труби, ви можете мати декілька серверів БД, кожен з яких має власних слухачів запитів.

Перевага названих труб полягає в тому, що це зазвичай набагато швидше і звільняє ресурси мережевого стеку.

- BTW, у світі Windows ви також можете назвати труби віддаленим машинам - але в цьому випадку названа труба транспортується через TCP / IP, тому ви втратите продуктивність. Використовуйте названі труби для місцевого зв'язку машини.


1
У чому мінус?
lindhe

2
@lindhe Немає автоматичної працездатності в мережі. Взагалі складніше встановити на практиці. Інша реалізація в Windows, ніж в Unix / Unix-подібних системах. Вони круті, але я б не турбував, якщо виступ не обов'язковий.
судо

43

У Unix та Windows є речі, які називаються "Названі труби", але вони поводяться по-різному. На Unix названа труба - це одностороння вулиця, яка, як правило, має лише одного читача та одного письменника - пише письменник, а читач читає, ви розумієте?

У Windows річ під назвою "Named pipe" - це об'єкт IPC, більше схожий на сокет TCP - все може протікати обома способами, і є деякі метадані (Ви можете отримати облікові дані речі на іншому кінці тощо).

Труби з назвою Unix відображаються як спеціальний файл у файловій системі і до них можна отримати звичайні команди вводу-виводу файлів, включаючи оболонку. Вікна немає, і їх потрібно відкривати за допомогою спеціального системного дзвінка (після якого вони поводяться, як правило, як звичайна ручка win32).

Ще більш заплутаним в Unix є щось, що називається "сокет Unix" або сокет AF_UNIX, який працює більше (але не зовсім як) win32 "з назвою труба", будучи двонаправленим.


23

Linux Труби
First In First Out (FIFO) механізм interproccess зв'язку.

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

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

Щоб створити названу трубу, яку називають "myPipe", з командного рядка ( man man ):

mkfifo myPipe  

Щоб створити названу трубку з c, де "ім'я шляху" - це ім'я, яке ви хотіли б мати, і "режим" містить дозволи, які ви хочете мати для цього ( man page ):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

2
"Ви можете використовувати трубу так само, як і звичайний файл" - не зовсім вірно. Не можна ні tell()позиціонувати, ні seek()в трубі.
nyov

19

За даними Вікіпедії :

[...] Традиційна труба "безіменна", оскільки вона існує анонімно та зберігається лише до тих пір, поки процес працює. Названа труба є стійкою до системи та існує поза терміном експлуатації, і вона повинна бути "від'єднана" або видалена, коли вона більше не використовується. Процеси, як правило, приєднуються до названої труби (як правило, з'являється у вигляді файлу) для здійснення IPC (міжпроцесового зв'язку).



7

Труби - це спосіб передачі даних між додатками. Під Linux я використовую це весь час для передачі результатів одного процесу в інший. Це анонімно, оскільки додаток призначення не має уявлення, звідки береться цей вхідний потік. Це не потрібно.

Ім'я труба просто спосіб активно закріплювати на існуючу трубу і пилососити вгору свої дані. Це для ситуацій, коли постачальник не знає, що клієнти будуть їсти дані.


6

Це exeprt від Technet (тому не впевнений, чому позначена відповідь говорить, що названі труби швидші ??):

Названі труби проти TCP / IP розетки

У швидкому середовищі локальної мережі (LAN) протоколи управління передачею / Інтернет-протокол (TCP / IP) розетки та іменовані труби клієнти порівнянні за продуктивністю. Однак різниця в продуктивності між TCP / IP-розетками та іменованими трубами стає очевидною при повільних мережах, наприклад, у широких мережах (WAN) або комутованих мережах. Це пояснюється різними способами взаємодії міжпроцесорних механізмів зв'язку (IPC) між однолітками.

Для названих труб мережеві комунікації, як правило, більш інтерактивні. Рівень не надсилає дані, поки інший одноранговий запитує про це за допомогою команди read. Мережеве зчитування, як правило, включає в себе ряд записуючих труб, названих труб, перш ніж він починає зчитувати дані. Це може бути дуже дорогим у повільній мережі та спричинити надмірний мережевий трафік , що, в свою чергу, впливає на інших мережевих клієнтів.

Також важливо уточнити, якщо ви говорите про місцеві труби або мережеві труби. Якщо серверна програма працює локально на комп'ютері, на якому працює екземпляр SQL Server, місцевий протокол Named Pipes є опцією. Місцеві труби з назвою працюють в режимі ядра і дуже швидко.

Для TCP / IP-сокетів передача даних є більш обтічною та має менші витрати. Передача даних також може скористатися механізмами підвищення продуктивності TCP / IP Sockets, такими як вікно, затримка підтвердження тощо. Це може бути дуже корисним у повільній мережі. Залежно від типу додатків такі відмінності в продуктивності можуть бути істотними.

TCP / IP-розетки також підтримують чергу відставання. Це може забезпечити обмежений ефект згладжування в порівнянні з названими трубами, що може призвести до помилок, зайнятих трубою, при спробі підключення до SQL Server.

Як правило, TCP / IP є кращим у повільній локальній мережі, WAN або комутованій мережі, тоді як названі труби можуть бути кращим вибором, коли швидкість мережі не є проблемою, оскільки вона пропонує більше функціональності, простоти використання та параметрів конфігурації.


5

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

MSDN


4
Названі труби з'явилися в V6 або AT&T Unix близько 1975 року.
dmckee --- кошеня колишнього модератора

До! Це трохи раніше, ніж Microsoft. Наскільки мені відомо, вони не часто використовуються в додатках Unix / Linux. Правда?
Кен

Я використовую названу трубку для свого генератора випадкових підписів - оскільки пошта та додатки usenet очікують, що у вашому підписі буде файл з назвою $ HOME / .signature, моя програма створює .signature як іменовану трубу та записує до неї випадкові цитати.
Пол Томблін

3

Іменовані труби в контексті unix / linux можна використовувати для створення двох різних оболонок для спілкування, оскільки оболонка просто не може ділитися чим-небудь з іншою.

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

Без названих труб (або будь-якого семафору) запуск сценарію у фоновому режимі не є проблемою. Річ у тім, що коли він закінчується, ви просто не можете отримати доступ до екземпляра у фоновому режимі.

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

Рішення полягало в тому, щоб реалізувати дві труби, одну ПРОЧИТАТИСЯ та іншу ЗАПИСИТИ, коли ви запускаєте демон. Потім змусьте його, серед інших його завдань, прослухати програму READ. Тоді функція Stop () містить команду, яка запише повідомлення в трубу, яка буде оброблятися фоновим сценарієм, який виконає вихід 0. Таким чином, наш другий екземпляр того ж сценарію повинен виконувати лише завдання: скажіть першій інстанції зупинитися.

Таким чином один і єдиний сценарій може запускатись і зупиняти себе.

Звичайно, у вас є різні способи зробити це, наприклад, запустивши зупинку за допомогою дотику, наприклад. Але це приємно і цікаво кодувати.


1

Названі труби - це система вікон для міжпроцесового зв'язку. У випадку SQL-сервера, якщо сервер знаходиться на тій же машині, що і клієнт, то для перенесення даних можна використовувати іменовані канали, на відміну від TCP / IP.


Це не лише для Windows, як це відображається у вашій відповіді. Як уже зазначали інші, названі труби існували з 70-х років в UNIX, як правило, начебто це спеціальний файл. Будь-ласка, відхилено, але виправте свою відповідь.
Кріс Чарабарук
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.