unix etki alanı soketi VS adlandırılmış yöneltmeler?


122

Soket adında bir unix'e baktıktan sonra boru olarak adlandırıldığını düşündüm. Pipolara baktım ve pek bir fark görmedim. Farklı şekilde başlatıldıklarını gördüm ama fark ettiğim tek şey bu. Her ikisi de C yazma / okuma işlevini kullanır ve AFAIK gibi çalışır.

Unix alan soketleri ile adlandırılmış yöneltmeler arasındaki fark nedir? Ne zaman birini diğerine tercih ederim? Varsayılan olarak hangisini kullanmalıyım (C ++ 'da vektörü varsayılan olarak deque, list veya ihtiyaç duyarsam başka herhangi bir şey kullanmaktan nasıl kullanırım)?

c  linux 

1
@GregHewgill: Maalesef bu soru sorduğum farktan çok "IPC nedir" sorusu: /. Bunu göndermeden önce gördüm, bağlantı kurmalı ve ilgili olduğunu söylemeli miydim? (bana yardımcı

1
@acid: Evet, ilgili soruları birbirine bağlamak ve hala hangi soruyu sorduğunuzu açıklamak her zaman iyi bir fikirdir.
Ben Voigt

3
Bu makale onu oldukça iyi özetledi. Unix Etki Alanı Soketlerinin Gizemini Çözme
Cong Ma

Bozuk bağlantı: techdeviancy.com/uds.html
mcdado

Yanıtlar:


106

UNIX etki alanı soketleri genellikle adlandırılmış yöneltmelerden daha esnektir. Avantajlarından bazıları:

  • Bunları iletişim kuran ikiden fazla işlem için kullanabilirsiniz (örneğin, bağlanan potansiyel olarak birden çok istemci işlemine sahip bir sunucu işlemi);
  • Çift yönlüdürler;
  • İşlemler arasında çekirdek tarafından doğrulanmış UID / GID kimlik bilgilerinin aktarılmasını desteklerler;
  • İşlemler arasında dosya tanımlayıcı geçişini desteklerler;
  • Paket ve sıralı paket modlarını desteklerler.

Bu özelliklerin çoğunu kullanmak için, send()/ recv()yerine write()/ sistem çağrıları ailesini kullanmanız gerekir read().


11
Öte yandan, kanal adlarının open(2), normal çağrılar yoluyla "bağlanılabilme" avantajına sahip olduğu ve bu da onları normalde yalnızca dosya adı argümanları alan programlar arasında geçici ardışık düzenler oluşturmak için daha uygun hale getirdiği söylenmelidir .
Dolda2000

66

Bir fark, adlandırılmış kanalların tek yönlü olmasıdır, bu nedenle iki yönlü iletişim kurmak için bunlardan ikisini kullanmanız gerekir. Elbette prizler iki yönlüdür. Bir yerine iki değişken kullanmak biraz daha karmaşık görünüyor (yani, bir soket yerine iki boru).

Ayrıca, wikipedia makalesi şu noktada oldukça açıktır : "Unix etki alanı soketleri bayt akışları olarak veya veri birimi dizileri olarak oluşturulabilirken, borular yalnızca bayt akışlarıdır."


İsimli borular aslında çift yönlüdür ancak yarı çift yönlüdür . Bu, iletişimin ya A'dan bitiş B'ye ya da B'den A'ya gidebileceği anlamına gelir, ancak ikisi birden asla aynı anda olamaz.


1
hmm ilginç +1. Bytestream ve datagram arasındaki farkın ne olduğunu tesadüfen biliyor musunuz? Belki bu soru için zaten yaptığınız gibi bir veya iki cümle içinde örnek olabilir mi?

7
@acidzombie: Datagram modundaki bir kanal veya soket, sınırları korur, böylece bir writeçağrı bir çağrı üretir read. Akış modunda veriler tek bir uzun akışta birleştirilebilir, bu nedenle birçok yazma aynı anda okunabilir veya bunun tersi de mümkündür. (Jtoberon'un cevabına göre Unix'in sahip olmadığı pencerede datagram boruları var)
Ben Voigt

1
@BenVoigt, datagram soket paket teslimi güvenilir değildir, bu nedenle yazma işlemi mutlaka bir okuma çağrısı oluşturmayacaktır. Belki yerel soketler için, ancak bu sizin yorumunuzdan net değil. Yani ne olursa olsun sorunları var.
xaxxon

3
@xaxxon: boru ve alanı soketlerine Hem olan kayıpsız alıcı, hepsi de kendi sıraları boşaltılırken yani, lokal.
Ben Voigt 13

6
Evet, UDP'den farklı olarak , datagram Unix alan soketleri siparişte teslimat garantilidir .
jtchitty
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.