Посмотрев на сокет с именем unix, я подумал, что это именованные каналы. Я посмотрел на трубки с именами и не увидел большой разницы. Я видел, что они были инициализированы по-разному, но это единственное, что я заметил. Оба используют функцию записи / чтения C и работают одинаково AFAIK.
В чем разница между сокетами домена unix и именованными каналами? Когда я бы предпочел одно другому? Что я должен использовать по умолчанию (например, как я использую использовать вектор по умолчанию в C ++, чем использовать deque, list или что-то еще, если у меня есть потребности)?
Ответы:
Сокеты домена UNIX обычно более гибкие, чем именованные каналы. Некоторые из их преимуществ:
Для того, чтобы использовать многие из этих функций, вы должны использовать
send()
/recv()
семейство системных вызовов , а неwrite()
/read()
.источник
open(2)
вызовов, что делает их более подходящими для построения специальных конвейеров между программами, которые обычно принимают только аргументы имени файла.Одно отличие состоит в том, что именованные каналы являются односторонними, поэтому вам нужно использовать два из них для двусторонней связи. Розетки конечно двухсторонние. Кажется немного сложнее использовать две переменные вместо одной (то есть две трубы вместо одного сокета).
Кроме того, статья в Википедии довольно четко разъясняет следующий пункт : «Сокеты домена Unix могут быть созданы как потоки байтов или как последовательности дейтаграмм, тогда как каналы являются только потоками байтов».
Именованные каналы фактически двунаправленные, но полудуплексные . Это означает, что связь может идти либо от конца A к концу B, либо от B к A, но никогда одновременно.
источник
write
вызов производит одинread
вызов. В потоковом режиме данные могут быть объединены в один длинный поток, так что можно читать много записей одновременно, или наоборот. (В Windows есть датаграммы, согласно ответу jtoberon, в Unix их нет)