Доменный сокет unix VS именованные каналы?

122

Посмотрев на сокет с именем unix, я подумал, что это именованные каналы. Я посмотрел на трубки с именами и не увидел большой разницы. Я видел, что они были инициализированы по-разному, но это единственное, что я заметил. Оба используют функцию записи / чтения C и работают одинаково AFAIK.

В чем разница между сокетами домена unix и именованными каналами? Когда я бы предпочел одно другому? Что я должен использовать по умолчанию (например, как я использую использовать вектор по умолчанию в C ++, чем использовать deque, list или что-то еще, если у меня есть потребности)?


источник
1
@GregHewgill: к сожалению, этот вопрос больше о том, «что такое IPC», а не о разнице, которую я спрашиваю: /. Я видел это перед публикацией, нужно ли было связать и сказать, что это связано? (мне это не помогло)
1
@acid: Да, всегда полезно связать связанные вопросы и объяснить, какой вопрос у вас остался.
Бен Фойгт
3
Эта статья довольно хорошо резюмировала это. Демистификация сокетов домена Unix: thomasstover.com/uds.html
Конг Ма

Ответы:

106

Сокеты домена UNIX обычно более гибкие, чем именованные каналы. Некоторые из их преимуществ:

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

Для того, чтобы использовать многие из этих функций, вы должны использовать send()/ recv()семейство системных вызовов , а не write()/ read().

кафе
источник
11
С другой стороны, возможно, следует сказать, что каналы имен имеют то преимущество, что они могут быть «подключены» с помощью обычных open(2)вызовов, что делает их более подходящими для построения специальных конвейеров между программами, которые обычно принимают только аргументы имени файла.
Dolda2000
66

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

Кроме того, статья в Википедии довольно четко разъясняет следующий пункт : «Сокеты домена Unix могут быть созданы как потоки байтов или как последовательности дейтаграмм, тогда как каналы являются только потоками байтов».


Именованные каналы фактически двунаправленные, но полудуплексные . Это означает, что связь может идти либо от конца A к концу B, либо от B к A, но никогда одновременно.

jtoberon
источник
1
хм интересно +1. Вы случайно не знаете, в чем разница между байтовым потоком и дейтаграммой? Может быть, один или два примера, как вы уже сделали для этого вопроса?
7
@acidzombie: канал или сокет в режиме дейтаграммы поддерживает границы, так что один writeвызов производит один readвызов. В потоковом режиме данные могут быть объединены в один длинный поток, так что можно читать много записей одновременно, или наоборот. (В Windows есть датаграммы, согласно ответу jtoberon, в Unix их нет)
Бен Фойгт,
1
@BenVoigt Ну, доставка пакетов сокета дейтаграммы ненадежна, поэтому запись не обязательно генерирует вызов чтения. Возможно, для локальных сокетов, но это не ясно из вашего комментария. Так что, несмотря на это, есть проблемы.
xaxxon 01
3
@xaxxon: оба канала и сокеты домена unix являются локальными, поэтому без потерь получатель вообще очищает свои очереди.
Бен Фойгт
6
Да, в отличие от UDP, сокеты домена Unix для дейтаграмм гарантируют доставку по порядку.
jtchitty