Unix доменный сокет VS именованные каналы?

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

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

Ответ 1

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

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

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

Ответ 2

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

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


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