Ağ arayüzleri neden diğer aygıtlar gibi / dev gibi değil?


70

Çoğunlukla merak ediyorum ama neden / dev içindeki ağ arayüzleri değil? / Dev altındaki bir düğüm olarak temsil edilmeyen başka tür cihazlar var mı?


2
Unix'teki her şeyin mantraya rağmen nasıl bir dosya olmadığı hakkında en az bir makale / rant gördüm ve bu sorunu dile getirdi. Şimdi bulamıyorum, ama muhtemelen Plan 9 veya GNU Hurd ile ilgili bir yazıydı.
Shawn J. Goff

3
En azından Solaris altında, / dev altındaki ağ arayüzleri var.
jlliagre

2
Unix'teki her şey bir dosya olmak zorunda değildir, sadece temel kullanıcı API'lerinin dosya tanımlayıcıları üzerinde düzgün ve eşit bir şekilde çalıştığı tüm kullanıcı bölgesine bu şekilde davrandığı anlamına gelmez. Bir soket açtığınızda, örneğin, kullanabilir read()ve write()aynı şekilde bir dosya üzerinde olur, ama fayda fonksiyonları recv()ve send()sizin için çok daha fazla ayak işi yapmak.
jgoldschrafe

1
Bu yıllardır kendime sorduğum bir soruydu. İstediğiniz ve yanıt verdiğiniz için teşekkür ederiz!
Dolanor

Yanıtlar:


43

Birçok cihazda, ana işlemler bilgisayardan çevre birimine bayt göndermek veya bilgisayardaki çevre biriminden bayt almaktır. Bu tür cihazlar borulara benzer ve karakter cihazları gibi iyi çalışırlar . Okuma ve yazmayan işlemler için (seri hattaki akış kontrolü gibi), cihaz, ioctl adı verilen geçici komutlar sunar .

Bazı aygıtlar normal dosyalara çok benzer: sınırlı sayıda bayttan oluşur ve belirli bir konumda yazdıklarınız daha sonra aynı konumdan okunabilir. Bu cihazlara blok cihaz denir .

Ağ arayüzleri daha karmaşık: okudukları ve yazdıkları şey bayt değil paket. Her zamanki arayüzü readve ile kullanmak hala mümkün writeolsa da, garip olurdu: muhtemelen her çağrı writebir paket gönderir ve her çağrı readbir paket alır (ve tampon paketin sığmayacak kadar küçükse) paket kaybolur).

Ağ arayüzleri sadece cihaz sağlayanlar olarak mevcut olabilir ioctl. Aslında, bazı unix varyantlarının yaptığı, fakat Linux'un olmadığı şeydir. Bu yaklaşımın bir avantajı var; örneğin, Linux'ta ağ arayüzleri udev'i kaldırabilirdi . Ancak avantajlar sınırlıdır, bu yüzden yapılmamıştır.

Ağla ilgili uygulamaların çoğu, bireysel ağ arayüzlerini önemsemez, daha yüksek bir seviyede çalışırlar. Örneğin, bir web tarayıcısı TCP bağlantıları yapmak ister ve bir web sunucusu TCP bağlantılarını dinlemek ister. Bu amaçla, faydalı olacak olan yüksek seviyeli ağ protokolleri için cihazlardır, örn.

{ echo $'GET http://www.google.com/ HTTP/1.0\r';
  echo $'Host: www.google.com\r';
  echo $'\r' >&0; cat; } <>/dev/tcp/www.google.com/80

Aslında ksh ve bash, TCP ve UDP müşterileri için böyle bir arayüz sağlar. Bununla birlikte, genel olarak, ağ uygulamaları dosyaya erişen uygulamalardan daha karmaşıktır. Veri alışverişlerinin çoğu readve benzeri çağrılarla gerçekleştirilirken write, bağlantının kurulması sadece bir dosya adından daha fazla bilgi gerektirir. Örneğin, TCP bağlantılarını dinlemek iki adım atar: biri sunucu dinlemeye başladığında yapılacak ve biri her müşteri bağlandığında yapılacaktır. Bu tür ilave adımlar, ağ oluşturma işleminin kendi API'sine sahip olmasının ana nedeni olan API dosyasına uygun değildir.

Genellikle /devLinux'ta girişleri olmayan (ancak bazı diğer unix değişkenlerinde bulunan) başka bir aygıt sınıfı video bağdaştırıcılarıdır. Prensip olarak, basit video adaptörleri , her pikselin rengini temsil eden bloklardan yapılmış blok aygıtları olabilen çerçeve oluşturucu aygıtlar olarak gösterilebilir. Hızlandırılmış video adaptörleri, uygulamaların komut gönderdiği karakter cihazları olarak gösterilebilir. Burada, cihaz arabiriminin dezavantajı yavaştır: görüntüleme uygulamasının (pratikte bir X sunucusu), herhangi bir şeyi görüntülerken çekirdek çağrıları yapması gerekir. Bunun yerine, X sunucusunun çoğunlukla doğrudan video bağdaştırıcısının belleğine yazdığı, çünkü daha hızlı.


2
Aslında, hızlandırılmış video bağdaştırıcıları Linux'ta DRI üzerinden pazı olarak ihraç ediliyor. Dosya G / Ç işlemleri gerekli değildir read/ writeikisi de değildir ; mmapharitalanmış dosyalar için kullanabilir ve cihaz hafızasına doğrudan erişebilirsiniz.
minmaxavg

11

Dizinde bulabilirsiniz /sys/class/net. Bu diğer dosyalara sembolik bağ /sys/device/../../, takip eden sanal makinem (linux kernel 3.10) çıktı. Ve udevadm info <filename>onun niteliğini incelemek için komutu kullanabilirsiniz.

lrwxrwxrwx. 1 root root 0 Apr  3 13:38 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33

U&L'ye hoş geldiniz. Her zaman satır içi kod etrafında ters alıntılar kullanın, özellikle <>de işaretleme olarak yorumlanacak şekilde kullanırsanız . (Basit bir klavyeye sahip kişiler, yaptığınız yorumlara yanıt olarak adınızın ilk karakterini yazmakta zorluk çekeceğinden, ASCII transkripsiyonuyla başlamak için adınızı da değiştirmek isteyebilirsiniz)
Anthon

9

AT & T / Solaris "Ulaştırma Seviyesi Arabirimi" (TLI) TCP / IP ağ bağlantısı yapmanın "/ dev / tcp" veya "/ dev / udp" gibi özel dosyalarına sahiptir. Programcı uygun bir protokol ailesinin soketini almak için bu özel dosyayı açar. Solaris'te yuva kullanan bir program derlerken bu nedenle "-lnsl" olması gerektiğini düşünüyorum: hepsinin altında TLI var.


4
Linux ayrıca /dev/tcpve /dev/udpçoğu çekirdeğin devre dışı bırakmasına rağmen.
bahamat

3

Geleneksel olarak Linux tam olarak karşılaştırılabilir durumda olmasa da, her türlü Açık Grup standartlarını (hatta LSB'nin dışında) bile takip etmeyi bırakalım. Linux'a daha fazla UNIX işlevselliği aktarma girişimleri olmuştur.

Glendix, Plan9'dan / net sanal dosya sisteminin bir portunu sunan ve tanımladığınız gibi yapmanıza izin veren bir projedir.

Linux için Plan9 Port / net dosya sistemi

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.