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