unix доменної розетки VS з ім'ям труб?


122

Подивившись на Unix з назвою socket, і я подумав, що вони названі трубами. Я подивився на назви труб і не побачив великої різниці. Я бачив, що вони були ініціалізовані по-різному, але це єдине, що я помічаю. Обидва використовують функцію запису / читання на C і працюють так само AFAIK.

У чому різниця між розетками домену Unix та названими трубами? Коли я б обрав одну над іншою? Що я повинен використовувати за замовчуванням (наприклад, як я використовую вектор за замовчуванням у векторі C ++, ніж використовувати deque, list чи все інше, якщо у мене є потреби)?

c  linux 

1
@GregHewgill: на жаль, це питання скоріше "що таке IPC", а не різниця, яку я запитую: /. Я бачив, що перед публікацією, чи повинен я зв’язати і сказати, що це пов'язано? (мені це не було корисно)

1
@acid: Так, зв’язування пов'язаних питань та пояснення того, яке питання у вас ще є, завжди є хорошою ідеєю.
Бен Войгт

3
Ця стаття в значній мірі її добре узагальнила. Демістифікуючі доменні розетки Unix: thomasstover.com/uds.html
Cong Ma

Відповіді:


106

Розетки домену UNIX, як правило, більш гнучкі, ніж названі труби. Деякі з їх переваг:

  • Ви можете використовувати їх для більш ніж двох процесів спілкування (наприклад, серверний процес з потенційно декількома клієнтськими процесами, що підключаються);
  • Вони двосторонні;
  • Вони підтримують передачу підтверджених ядром UID / GID облікових даних між процесами;
  • Вони підтримують дескриптори файлів, що передаються між процесами;
  • Вони підтримують режими пакетних та послідовних пакетів.

Щоб використовувати багато з цих функцій, вам потрібно використовувати send()/ recv()сімейство системних викликів, а не write()/ read().


11
З іншого боку, можливо, слід сказати, що труби з іменами мають перевагу в тому, що їх можна "підключити" за допомогою звичайних open(2)дзвінків, що робить їх більш придатними для побудови спеціальних конвеєрів між програмами, які зазвичай приймають лише аргументи імен файлів.
Dolda2000

66

Одна відмінність полягає в тому, що названі труби є односторонніми, тому вам потрібно буде використовувати дві з них для того, щоб здійснювати двосторонній зв'язок. Розетки звичайно двосторонні. Дещо складніше використовувати дві змінні замість однієї (тобто дві труби замість однієї розетки).

Також стаття у вікіпедії досить чітка щодо наступного пункту : "Сокети домену Unix можуть створюватися у вигляді потоків байтів або як послідовності дейтаграм, тоді як труби є лише потоками байтів".


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


1
хм цікаво +1. Чи випадково ви знаєте, в чому різниця між швидким потоком та дейтаграмою? Можливо, приклад у сенсації чи два, як ви вже зробили для цього питання?

7
@acidzombie: Труба або сокет режиму дейтаграми підтримують межі, щоб один writeвиклик створював один readвиклик. У потоковому режимі дані можуть бути об'єднані разом в один довгий потік, тому багато записів можна прочитати відразу, або навпаки. (У Windows є даніграми, згідно з відповіддю jtoberon, Unix не відповідає)
Бен Войгт

1
@BenVoigt, доставка пакетів пакетів дейтаграми недостовірна, тому запис не обов'язково генерує дзвінок зчитування. Можливо, для локальних розеток, але це не зрозуміло з вашого коментаря. Тож незалежно від цього є проблеми.
xaxxon

3
@xaxxon: І розетки, і розетки домену Unix є локальними, тому приймач без втрат сповіщає свої черги.
Ben Voigt

6
Так, на відміну від UDP, датаграми Unix доменних розеток гарантовано , замовлення доставки.
jtchitty
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.