FIFO, pipe ve Unix alan soketi Linux çekirdeğinde aynı şey midir?


30

FIFO'ların boru adını aldıklarını duydum. Ve onlar tam olarak aynı semantiklere sahipler. Öte yandan, Unix alan soketinin boruya oldukça benzer olduğunu düşünüyorum (daha önce hiç kullanmadığım halde). Bu yüzden hepsinin Linux çekirdeğinde aynı uygulamaya atıfta bulunup bulunmadığını merak ediyorum. Herhangi bir fikir?


Aşağıdaki cevaptan sorumun belirsiz olduğunu ve cevaplanması zor olduğunu fark ettim. Çekirdeğin (çekirdek geliştiricileri için bile) uygulama öğelerinin bu kadar fazla detayını kimsenin bilmemesi olasıdır. Birisi Unix domain soketi, pipe ve FIFO'nun Linux altında paylaşılan hafızaya gönderilen verileri tamponladığını onaylayabilirse sorum çözüldü. Şey ... kısmen çözüldü.
Justin,

FIFO = adlandırılmış yöneltmeler! FIFO'lar bir soket çifti gibi çift yönlü olabilir. Normal borular tek yönlüdür. Hepsinde dosya arayüzü ve dosya semantiği var. Uygulama neden sizin için önemli?
PSkocik

Boruların dairesel tamponlar olduğunu ve STREAMS sistemiyle bunların paylaşılan bir uygulama olduğunu biliyorum, ancak Linux varsayılan olarak STREAMS kullanmıyor. Linux'un bu IPC kanallarını kodladığını düşünüyorum. Yine de kontrol etmek istemiyorum. : D Neden yapmıyorsun? Kod halka açıktır.
PSkocik

Hepsi aynı uygulamayı paylaşıyorlarsa, etkinlikleri birbirine yakın olmalıdır. Ve bana göre, çekirdek kodunu anlamak çok zor.
Justin,

Yanıtlar:


35

UNIX etki alanı soketleri ve FIFO, uygulamalarının bir bölümünü paylaşabilir; ancak kavramsal olarak çok farklılar. FIFO çok düşük seviyede çalışır. Bir işlem boruya bayt yazar, diğeri ondan okur. Bir UNIX etki alanı soketi, bir TCP / IP soketi ile aynı davranışa sahiptir.

Bir soket çift yönlüdür ve aynı anda birçok işlem tarafından kullanılabilir. Bir işlem aynı soket üzerindeki birçok bağlantıyı kabul edebilir ve aynı anda birkaç müşteriye katılabilir. Çekirdek her seferinde yeni bir dosya tanıtıcısı sunar connect(2)veya accept(2)sokette çağrılır. Paketler her zaman doğru işleme gidecektir.
Bir FIFO'da bu imkansız olurdu. İki yönlü iletişim için iki FIFO'ya ihtiyacınız var ve müşterilerinizin her biri için bir çift FIFO'ya ihtiyacınız var. Seçici bir şekilde yazma veya okuma yolu yoktur, çünkü iletişim kurmak için çok daha ilkel bir yoldur.

Anonim borular ve FIFOlar çok benzer. Aradaki fark, isimsiz boruların dosya sistemindeki dosyalar olarak bulunmaması dolayısıyla hiçbir işlem yapamaz open(2). Onları başka bir yöntemle paylaşan işlemlerde kullanılırlar. Bir işlem FIFO'lar açar ve ardından örneğin a'yı gerçekleştirirse, fork(2)çocuğu dosya tanımlayıcılarını ve bunların arasında boruyu devralır.

UNIX etki alanı soketleri, adsız kanallar ve FIFO, paylaşılan bellek bölümlerini kullanmaları bakımından benzerdir. Uygulamanın ayrıntıları bir sistemden diğerine değişebilir, ancak fikir her zaman aynıdır: aynı bellek bölümünü iki ayrı işlemde bellek eşlemesine veri paylaşmaları için ekleyin
( düzenleme: bunu uygulamanın açık bir yolu olurdu, ancak bu gerçekte belleğe yalnızca çekirdek belleğini kullanan Linux'ta nasıl yapıldığını değil, aşağıdaki cevaplara bakın: @ tjb63.
Daha sonra çekirdek sistem çağrılarını yapar ve mekanizmayı soyutlar.


"UNIX etki alanı soketleri ve FIFO uygulamalarının bir bölümünü paylaşabilirler" ... mesele "bir kısmı" ... Sadece sorumun belirsiz olduğunu ve cevaplanması zor olduğunu anladım. Çekirdeğin paylaştığı bölümlerin (çekirdek geliştiricileri için bile) hiç kimsenin o kadar fazla ayrıntı bilmemesi muhtemel değildir. Yine de ... Unix alan soketi, pipe ve FIFO'nun hepsinin Linux altında paylaşılan hafızaya gönderilen verileri tamponladığını onaylayabilir mi? Onaylanırsa sorum çözüldü. Şey ... kısmen çözüldü.
Justin,

Evet, çekirdeğin yönettiği bir tampon var. Örneğin, FIFO'larla, sen yazarı öldürebilirsin ve okuyucu yazarın ölümünden önce hala boruya gönderilenleri okuyabilir. Soketlerle, biraz daha karmaşık, çünkü bağlı bir protokolle çalışıyorlar. Ancak sokete bir int gönderir ve ardından int gönderen yığından temizlenecek şekilde kapsam dışına çıkarsa, alıcı yine de okuyabilir. Yani, bir yerlerde açıkça bir tampon var.
lgeorget

Yorumu tekrar okudum, burada net olmadığımdan emin değilim ... Hala net olmayan bir şey varsa bana bildirin.
lgeorget,

Yorumunuz bana açık.
Justin,

7

Burada bununla ilgili güzel bir tartışma var: http://www.slideshare.net/divyekapoor/linux-kernel-implementation-of-pipes-and-fifos

Görebildiğim kadarıyla, hem sunum slaytlarından hem de kaynak @ http://lxr.free-electrons.com/source/fs/pipe.c - fifo, borunun etrafına sarıcı olarak uygulanır ve borunun kendisi pipefs sanal dosya sistemi aracılığıyla uygulandı ..

@lgeorget - borular okuyucu ve yazar arasındaki tampon için çekirdek bellek kullanmak için görünür - onlar gibi 'paylaşılan hafızayı' kullanmayın, kullanıcı ve çekirdek adres boşluk (örneğin arasındaki bellek kopyalama pipe_readaramalar pipe_iov_copy_to_user, hangi aramalar __copy_to_user_inatomic(veya copy_to_user) . __copy_to_user_inatomicaramaları copy_user_genericbirkaç ASM uygulamaları ile ilgili olup,.


4

Bir "FIFO" ve " adlandırılmış yöneltme" aynı şeydir - bir kabuğun komut satırındaki iki komut arasında bir "yöneltme" (|) kullanmasından oldukça farklı olsa da.

Adlandırılmış bir boru (FIFO), iki program tarafından paylaşılan ve biri tarafından okunan, diğeri okunan tek bir "dosya" dır. Öte yandan bir soket, iki "dosya" arasındaki "bağlantı" dır; bir ağ kullanın ve ayrı bilgisayarlarda olun - bir program bir "dosyaya" okuyor / yazıyor ve başka bir program diğerine okuyor / yazıyor ... Öyle olduğunu sanmıyorum ... Öte yandan soketler ve adlandırılmış kanallar - dosyalar, cihazlar, sembolik linkler - hepsi de inode kullanır ve hepsi ortak özellikler (okuma ve yazma gibi) uygular.


1
Evet, Unix alan soketi türden bir sokettir, bu yüzden API, TCP veya UDP vb. Gibi diğer soket API'lerine benzer. Ancak, Unix alan soketi yalnızca "yerel" IPC olarak kullanılabilir. Veri aktarma şekli de ilk bakışta, FIFO & Pipe'a çok benziyor. Bu yüzden bunun mümkün olduğunu düşünüyorum Unix alan soketinin API'si aynı uygulamanın bir başka kapsüllemesidir, bu yüzden onu sanki bir soketmiş gibi kullanıyoruz. Sanırım hepsinin çekirdeği aynı içsel paylaşması mümkün ... Doğru olup olmadığını onaylamak istiyorum.
Justin,

1

Sanmıyorum Justin. Yanılmıyorsam ve muhtemelen öyleyim, FIFO'ların diskte bir dosya kullandığını ve Unix Domain soketlerinin çekirdek belleği kullandığını düşünüyorum.

Ayrıca, Unix alan soketlerinin çift yönlü olduğunu belirten yukarıdaki postere ek olarak, bu yalnızca SOCK_STREAM soketi kullanıldığında geçerlidir. SOCK_DGRAM Unix alan soketleri aslında tek yönlüdür ve sadece () connect () kodundan bind () kodunu gönderebilir.

Elbette, connect () olarak adlandırılan kodun kendi bitiş noktasını oluşturmak için bind () öğesini çağırması gerekir, ancak sorunuzla ilgisi yoktur.


3
StackExchange'e hoş geldiniz ve gönderdiğiniz için teşekkür ederiz. Birkaç açıklama ... 1) "Muhtemelen" yanılıyorsanız, cevap vermeden önce iki kez kontrol etmelisiniz; bu site bir forum ya da sohbet değil. 2) Datagram yönelimli soketlerdeki hassasiyetiniz için teşekkür ederiz 3) Soruyla "yapacak bir şeyi" olmayan bir şey göndermeye gerek yoktur. :)
lgeorget

1

Benim 2 kuruş ... FIFO ve UNIX soketinin her ikisi de iki yönlüdür (benzerdir) ancak soketin yıldız topolojisi vardır, bununla birlikte FIFO yalnızca bir sıradır (ve dolayısıyla birbirlerinin yerini alamazlar), evet.

**

char * myfifo = "/tmp/myfifo";
mkfifo(myfifo, 0666);
fd = open(myfifo, O_RDWR);   //so that you can read/write to it
 ...
write(fd, buff1, sizeof(buff1));  
getchar();//wait till some one reds this and writes something else
int sz=read(fd, buff1, sizeof(buff1));  //read that something**

FIFO iki yönlüdür?
jhfrontz
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.