Unix İnternet soketleri dosyalar mı?


23

"Her şey bir dosyadır" un Unix'in temel kavramlarından biri olduğunu biliyorum, ancak yuvalar normal dosya sistemi arabirimleri gibi değil, çekirdek tarafından sağlanan (soket, sendto, recv, vb.) Farklı API'ler kullanıyor.

Bu "Her şey bir dosyadır" burada nasıl uygulanır?

Yanıtlar:


26

soketler farklı API'ler kullanır

Bu tamamen doğru değil. Soketlerle kullanım için bazı ek işlevler vardır, ancak normal read()ve write()bir soket fd'de kullanabilirsiniz.

bu "Her şey bir dosyadır" burada nasıl uygulanır?

Bir dosya tanımlayıcısının katıldığı anlamda.

"Dosya" tanımınız bir dosya sisteminde depolanan ayrı bir bayt dizisi ise, her şey bir dosya değildir. Bununla birlikte, dosya tanımınız daha çok tanıtıcı ise - bilgi için bir kanal, yani bir G / Ç bağlantısı - o zaman "her şey bir dosyadır" daha anlamlı olmaya başlar. Bu şeyler kaçınılmaz olarak bayt dizilerini içerir, ancak nereden geldikleri ya da gittikleri yerler bağlamsal olarak farklılık gösterebilir.

Bununla birlikte, tam anlamıyla amaçlanmadı. Bir daemon bir dosya değildir, bir daemon bir süreçtir; ancak IPC yapıyorsanız , başka bir işlemle ilişkilendirme yönteminiz dosya tarzı varlıklar tarafından hafifletilebilir.


5
"Her şey bir dosyadır" ifadesinin doğru bir şekilde yeniden yazıldığını söyleyebilirim "tüm arayüzler dosyalar aracılığıyla olmalı". Süreçlerle dosyalar üzerinden etkileşimde bulunuyorsunuz (stdin / out / err, / proc / $ pid, etc). Ağla dosyalarla (soketler / dosya tanımlayıcıları) etkileşime girersiniz. Fare ile bir dosya (/ dev / fare) ile etkileşime girersiniz.
Patrick

Bir keresinde bir soket kolunu / proc içinden açarak klonladım.
Joshua

12

"Her şey bir dosyadır" sadece bir abartıdır. Bu olarak 1970'lerde yeni ve oldu UNIX en önemli ayırt edici özelliği. Fakat bu sadece bir pazarlama konsepti, UNIX'in gerçek bir temeli değil, çünkü açıkça doğru değil. HER ŞEYİ bir dosya olarak ele almak yararlı veya mantıklı değildir.

CPU bir dosya mı? Programınız yeni bir talimat almak için bir CPU mu okuyor? RAM bir dosya mı? Programınız bir sonraki baytı okuyor mu ()?

O zamanlar size bir disket için bir API ve bir sabit disk için farklı bir API, manyetik bant için farklı bir API ve farklı terminaller için bir sürü farklı API veren OS türleri vardı. IBM anabilgisayar sistemleri, sabit disklerde farklı dosya türlerine sahipti ve size her biri için farklı bir API verdi, ister inan ister inanma! Bu yüzden UNIX "bir dosyadır" yaklaşımı, "stdin / stdout / stderr" yaklaşımı ile birlikte, hem kullanıcılara hem de programcılara çok zarif bir soyutlama getirdi.

Ağ ile bu özel soyutlama işe yaramadı. Ve hiçbir zararı yoktur, sadece işletim sisteminin genel zarafeti ve tutarlılığı daha azdır. Ama işe yarıyor. /dev/myinternetz/www/google/com/tcp/80Bugün sisteminizde herhangi bir yerde bir dosya görüyor musunuz ? Açabilir (), bir sorgu yazabilir ve () güzel HTML'de cevabı okuyabilir misiniz? Yok hayır? Bunun nedeni, bu "bir dosyadır" soyutlaması ağ etrafında etkileşimde bulunmak için çok kullanışlı değildi. Uygulamada çok iyi çalışmaz. Sızdıran soyutlamalar yasası iş başında.


9
Eğlenceli gerçek: bash'ın bazı sürümleri açmanıza izin verecek /dev/tcp/www.google.com/80. Gerçek bir dosya değil - bash sadece numara yapıyor.
user253751

2
@ immibs: Daha önemlisi, bunu gerçekten uygulayan bir dosya sistemi yapmak makul bir şekilde mümkün olacaktır.
Joshua

Ben okumak herhalde /dev/memya /dev/kmemisterseniz.
Jason C,

4
9 numaralı planın bunu daha da ileri götürdüğünü ve gerçekten de, ağ protokollerinin / dev / myinternetz / www / google / com / tcp / 80 örneğinizin (farklı bir yolla) etkisine yönelik sahte bir dosya sistemi aracılığıyla ele alındığını unutmayın. Ek olarak, fiziksel ram aslında bir dosyaya çok benziyor, tıpkı bir dosyayı mmap ederken ram'ı sanal adres alanınıza koyarsınız. (Bu fikir üzerine malloc uygulanır).
Vality

1
Aşırı "her şey bir dosyadır" alarak Plan 9, "her şey ağa saydamdır" ın yanı sıra oldukça güçlü bazı çıkarımlar içeriyor. Örneğin, NAT'a gerek yoktur, yönlendiricinizin TCP / IP yığınını (sadece ağa saydam olan bir dosyadır (sistem)) yerel makinenize monte edebilir ve paketleri doğrudan yönlendiricinizden gönderebilirsiniz.
Jörg W Mittag

7

Yuvalar dosyadır. readVe writebir soket üzerinde kullanabilirsiniz : onlar arama recvve sendile eşdeğerdir flags=0. Onları kapat close. dupDosya tanımlayıcılarını karıştırmanız gerekirse , bunları etrafta ve arkadaşlarınızla birlikte taşıyabilirsiniz . Bazı bayrakları ayarlayabilir fcntlve çağırdıktan sonra stdio arabelleğini kullanabilirsiniz fdopen. Liste devam ediyor. Çok önemlisi, soketler dahil, herhangi bir tür dosyayı arayabilir selectve arayabilirsiniz poll, böylece bu işlevler bir programın basitçe dosya tanımlayıcılarını listeleyerek herhangi bir yöntemle girdi alana kadar engellemesini sağlar.

Bazı soket tipleri (ekstra sistem çağrıları vardır recvve send, shutdowncihazlar için ekstra bir sistem çağrısı (var gibi, vs.), ioctl).

Tüm dosyaların adları yoktur ve bunları yapanlar her zaman dizin yapısında yaşamazlar. Tarafından oluşturulan pipe(örneğin bir kabuk boru hattında) borular ve oluşturulan yuvaların socketpairisimleri yoktur, ancak bunlar hala dosyalardır. Tarafından oluşturulan yuvaların socket, sözdizimi etki alanına bağlı olan bir adı vardır. Bu ad, içinde geçirilir struct sockaddriçin bindve diğer fonksiyonları. Bir Unix ( AF_UNIX) soketi için, isim struct sockaddr_unbir aile ve bir dize olan a'dır; dizeye bağlı olarak, bu bir dosya adı olabilir (adlandırılmış soketler mknodbirçok unix varyantında oluşturulabilir) veya olmayabilir (soyut ad alanı). IPv4 (For AF_INET) soket, adı olan struct sockaddr_inbir port numarası ve IP adresini, artı içeren, protocolgelen socketçağrı.


7

Eğer statbir yuva, bunu ben dosya sistemi üzerinde bir dosya olarak sınıflandırmak, bir inode numarasını ve düzenli diğer dosya özelliklerine sahip olduğunu göreceksiniz. Örnek:

# file live
live: socket
# stat live
File: `live'
  Size: 0               Blocks: 0          IO Block: 4096   socket
Device: fc03h/64515d    Inode: 198817      Links: 1
Access: (0660/srw-rw----)  Uid: (23129/  icinga)   Gid: (23130/icinga-cmd)
Access: 2014-11-07 09:27:59.000000000 -0800
Modify: 2014-11-05 09:27:03.000000000 -0800
Change: 2014-11-05 09:27:03.000000000 -0800

11/17. Linux için ek bilgiler (ext3): Bir sokette bir inode vardır (diskte 256 baytlık bir blok) ancak veri bloğu yoktur (bunu inode'u çıkararak ve veri bloğu işaretleyicilerini inceleyerek doğrulayabilirsiniz; 0 bir Blockcount gösteren debugfs 'stat' çalışan). Bu nedenle, dosya meta verileri (sahip, grup, izinler, vb.) Var, ancak diskte veri içeriği yok. Bu, aynı touch /tmp/foozamanda 0 blok sayısına sahip normal bir boş dosya ( ) ile aynıdır. İlk durumda, inode içindeki "type" alanı "socket" i gösterir; İkinci durumda, "normal dosya" yı gösterir.

Referanslar: ext2 inode yapısı ; stat, dumpe2fsve debugfskomutlar.


1
Çalıştırmak fileya da çalıştırmak statiçin bir şeyler yapmanın bir dosya olduğunu söyleyebilirim .
Kevin
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.