Доменные сокеты UNIX и FIFO могут совместно использовать некоторую часть своей реализации, но концептуально они очень разные. FIFO функционирует на очень низком уровне. Один процесс записывает байты в канал, а другой читает из него. Сокет домена UNIX ведет себя так же, как и сокет TCP / IP.
Сокет является двунаправленным и может использоваться многими процессами одновременно. Процесс может принимать несколько соединений в одном сокете и одновременно обслуживать несколько клиентов. Ядро каждый раз выдает новый файловый дескриптор connect(2)
или accept(2)
вызывается из сокета. Пакеты всегда будут идти к правильному процессу.
На FIFO это было бы невозможно. Для двунаправленной связи вам нужны два FIFO и пара FIFO для каждого из ваших клиентов. Нет возможности писать или читать избирательно, потому что это гораздо более примитивный способ общения.
Анонимные каналы и FIFO очень похожи. Разница в том, что анонимные каналы не существуют в виде файлов в файловой системе, поэтому ни один процесс не может open(2)
это сделать. Они используются процессами, которые разделяют их другим методом. Если процесс открывает FIFO и затем выполняет, например, a fork(2)
, его дочерний элемент наследует свои файловые дескрипторы и, среди них, канал.
Доменные сокеты UNIX, анонимные каналы и FIFO похожи в том, что они используют сегменты разделяемой памяти. Детали реализации могут варьироваться от одной системы к другой, но идея всегда одна и та же: присоединить одну и ту же часть памяти к отображению памяти двух разных процессов, чтобы они совместно использовали данные
( правка: это был бы один очевидный способ реализовать это, но это не то, как это на самом деле делается в Linux, который просто использует память ядра для буферов, см. ответ по @ tjb63 ниже).
Затем ядро обрабатывает системные вызовы и абстрагирует механизм.