Antigluk
@Antigluk

FIFO-пайпы и Unix Sockets?

Какая разница между именоваными fifo-пайпами и юникс-сокетами? Ведь по сути назначение одно и то-же, представление у обоих как inode в файловой системе.
  • Вопрос задан
  • 6440 просмотров
Решения вопроса 1
rasa
@rasa
FIFO-пайпы — однонаправленные.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@shuraosipov
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. это вызвано накладными раскодами, связанными с созданием сокета, инициализацией и подключением к нему.
Ответ написан
Комментировать
pentarh
@pentarh
Разница большая, как между файловыми дескрипторами и сокетами. Не знаю, как там с мультипоточностью в фифо, но в тредах у них точно проблемы. А с сокетом все просто: accept(), fork() и вперед. К тому же сокеты относятся к сетевой подсистеме, для них есть свои буфера и sysctl'ы. И именно они предназначены для клиент-серверного взаимодействия.

А фифо это чето такое из мира применения perl )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы