Her soket için bir dosya var mı?


21

UNIX Dünyasında "Her şey bir dosyadır".

Yukarıdaki cümle ünlüdür. Koşarken echo "hello programmer" >> /dev/tty1verilen ipi izleyebilirim TeleType 1 ....

Her biri için dosya nerede ve nerede socket? Arkadaşımın bilgisayarıma bağlandığını ve onun IP'sinin h.h.h.hilgili dosyaya nasıl erişebileceğimi varsayalım. Mümkün mü?


3
Soket API'sı aslında bu konuda "Unix politikası" ndan bir sapmadır, çünkü başlangıçta BSD'den gelmiştir . Bell Labs'ten daima "Unix'ten daha fazla Unix" olan Plan 9 olduğunu unutmayın - ağ ve grafik API'leri bile dosyadır.
ntoskrnl

UNIX modelinin nerede yanlış gittiğinden bahseden Plan 9 gazetelerinde soket ve işlemlerden adil bir miktar bahsedilmiştir.
14:31

Yanıtlar:


9

erkek 7 unix:

AF_UNIX (AF_LOCAL olarak da bilinir) soket ailesi, aynı makinedeki işlemler arasında verimli bir şekilde iletişim kurmak için kullanılır. Geleneksel olarak, UNIX etki alanı soketleri adsız olabilir veya bir dosya sistemi yol adına bağlı olabilir (tür soketi olarak işaretlenmiş). Linux ayrıca dosya sisteminden bağımsız olan soyut bir ad alanını da destekler.

Yani her soket bir dosya olarak görülemez ("dosya adı olmadan dosya yok" anlamında).

Ancak yuva listelerine sahip dosyalar var (örneğin /proc/net/tcp); tam olarak "her şey bir dosya" dır.


38

Bir yuva olan bir dosya. Ancak tüm dosyaların adları yoktur. İşte isimleri olmayan birkaç dosya örneği:

  • Bir adı olan ve şimdi silinen ancak bir program tarafından açılmış olan herhangi bir dosya.
  • Kabuk işleci tarafından oluşturulan gibi adlandırılmamış bir boru| .
  • Çoğu soket : herhangi bir İnternet soketi veya dosya sistemi ad alanında olmayan bir Unix soketi (soyut ad alanında veya adsız olabilir).

Adsız borular veya soketler gibi dosyalar bir işlem tarafından oluşturulur ve yalnızca bu işlemde veya daha sonra oluşturulan alt işlemlerde erişilebilir. (Bu tamamen doğru değildir: açık bir boru veya soket (veya başka bir dosya) olan bir işlem, onu bir Unix soketi üzerinden diğer işlemlere aktarabilir; bu dosya tanımlayıcı geçişi olarak bilinir .)

Adı olan soketler (dosya sisteminde veya özetinde olsun) bu ad kullanılarak açılabilir. Ağ soketleri, uygun bağlantıya sahip herhangi bir makineden uzaktan açılabilir (veya daha kesin olarak bağlanır).


Bu doğru cevap.
jforberg,

4
/proc/<pid>/fd/*ve /proc/net/*ilginç olabilir
n611x007

Lütfen bu cevabı kabul et. IMHO çok daha doğru.
user1202136

13

Her soket için dosya nerede ve nerede?

"Her şey" abartıdır. Bu katı bir politika değildir, dosya sistemi erişimi sistem çağrılarıyla eşanlamlı olduğu için (yani, dosya sistemi çekirdeğin gerçekten bir arayüzüdür ve bu nedenle her şey için uygun bir format sağlar) arabirimler için dosya sistemini kullanmak yaygın bir uygulamadır. . Diğer işletim sistemleri bu kadar kullanılmaz, bu yüzden ayırt edici bir özellik olarak kabul edilir.

Hauke ​​Laging'in dediği gibi, "unix local" soketlerinde , boru adındaki gibi bir dosya düğümü vardır (bkz. man fifo). Ancak, internet protokol soketleri (ağ iletişimi için kullanılır) yapmaz. Bunun yerine, kullanıcı alanında bağlantı noktası numarasıyla ilişkilendirilirler. Tek bir bağlantı noktasındaki bir sunucu soketinin her birini kendi ayrı soketine bağladığını unutmayın (tek bir unix yerel soket dosyası da bir sunucu ile bu şekilde kullanılabilir, yani aynı dosya adresiyle ilişkili birden fazla soket olabilir) ve kod içinde aslında ayrı sayısal dosya tanımlayıcıları aracılığıyla ayrı ayrı tanımlanırlar.

Yani, bu anlamda tüm prizler olan dosyaları gibi çok ve bir bağlantısı var /proc/[pid]/fd/. Hatta readlink()bu inode'u çağırabilir ve komut satırı araçlarında kullanılan özel bir dosya adı alabilirsiniz lsof; Aynı şekilde soket tanıtıcısı hakkında da bilgi alabilirsiniz fstat().


"Kullanıcı alanında inode tarafından tanımlandı" mı demek istiyorsun? Her soket port numarasına sahip değildir ve aynı port numarası için birkaç soket olabilir (yine de bir anlam ifade etmemektedir).
Hauke

@HaukeLaging: İyi nokta. İkinci paragraftan başlayarak bu durumu daha net yapmak için düzenleme yaptım.
goldilocks
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.