FIFO-пайпы и Unix Sockets?
============================

 Какая разница между именоваными fifo-пайпами и юникс-сокетами? Ведь по сути назначение одно и то-же, представление у обоих как inode в файловой системе. 

 FIFO-пайпы — однонаправленные. 

**pipe** - это механизм коммуникации между процессами. pipe, как уже было сказано выше, является однонаправленным потоком данных, все данные, записанные процессом в пайп перенаправляются ядром другому процессу для чтения.  

pipe это объект VFS (Virtual File System), поэтому pipe не имеет соответсвутющего образа на диске, грубо говоря он хранится в памяти (pipefs).   

Главным недостатком pipe является тот факт, что невозможно открыть уже существующий pipe. Поэтому два произвольных процесса не могут использовать одновременно один и тот же pipe, за исключением случаев если pipe был создан общим родительским процессом.  
  
**fifo (named pipe)**  - это специальный файл, очень похожий на pipe, за исключением того, что fifo inode содержится в файловой системе, плюс fifo это двунаправленный механизм обмена данными между двумя и более процессами, поэтому доступ к fifo на чтение и запись может получить любой процесс. Грубо говоря процесс общения с использованием fifo выглядит следующим образом - "сервер" создает fifo файл, который успользуется "клиентами" для выполнения запросов. Каждый "клиент", прежде чем установить соединение с "сервером", создает другой fifo файл, в который "сервер" может записать ответ клиенту, при это указывая имя fifo в изначальном запросе.  
  
**socket (unix socket)** - это специальный файл, используемый для коммуникации между двумя и более различными процессами, выполняющимися на одной машине. Процессы обращаются к socket по его inode.   
  

Итак в чем же отличие fifo (named pipe) от unix socket:  

1. "Сервер" (или принимающий процесс) в fifo не умеет различать "Клиентов".   

"Клиенты", использующие unix socket имеют отдельные соединения с сервером. В fifo различные "клиенты" могут писать в pipe, но "Сервер" не может различить "Клиентов" друг от друга.  

2. При создании fifo и unix socket используются различные системные вызовы.  

Unix socket создается системным вызовом "socket()". fifo создается "mkfifo()"  

3. Для подключения к fifo и unix используюся различные системные вызовы.  
  

Сравнение по производительности - fifo vs unix socket:  

1. unix socket обеспечивает лучшую производительнось при передаче большого объема данных   

2. для малых объемов unix socket уступает в производительности fifo. это вызвано накладными раскодами, связанными с созданием сокета, инициализацией и подключением к нему. 

 Разница большая, как между файловыми дескрипторами и сокетами. Не знаю, как там с мультипоточностью в фифо, но в тредах у них точно проблемы. А с сокетом все просто: accept(), fork() и вперед. К тому же сокеты относятся к сетевой подсистеме, для них есть свои буфера и sysctl'ы. И именно они предназначены для клиент-серверного взаимодействия.  

  

А фифо это чето такое из мира применения perl )