Warum sind Netzwerkschnittstellen nicht wie andere Geräte in / dev?
70
Ich bin meistens neugierig, aber warum sind keine Netzwerkschnittstellen in / dev? Gibt es andere Arten von Geräten, die unter / dev nicht als Knoten dargestellt werden?
Ich habe mindestens einen Artikel darüber gesehen, wie alles in Unix trotz des Mantras keine Datei ist, und er zitiert dieses Problem. Ich kann es jetzt nicht finden, aber es war wahrscheinlich ein Artikel über Plan 9 oder GNU Hurd.
Shawn J. Goff
3
Zumindest unter Solaris gibt es unter / dev (/ devices actually) Netzwerkschnittstellengeräte.
Juli
2
Alles in Unix, was eine Datei ist, bedeutet nicht zwangsläufig, dass es sich für das gesamte Benutzerland so verhält, nur dass die zugrunde liegenden APIs ordnungsgemäß und einheitlich mit Dateideskriptoren arbeiten. Wenn Sie eine Steckdose öffnen, zum Beispiel, können Sie verwenden , read()und write()die gleiche Art und Weise , dass man es auf eine Datei, aber die Utility - Funktionen recv()und send()für Sie tun viel mehr Lauferei.
Jgoldschrafe
1
Das war eine Frage, die ich mir jahrelang gestellt habe. Vielen Dank für Ihre Anfrage und für die Antwort!
Dolanor
Antworten:
43
Bei vielen Geräten besteht die Hauptoperation darin, Bytes vom Computer an ein Peripheriegerät zu senden oder Bytes von einem Peripheriegerät auf dem Computer zu empfangen. Solche Geräte ähneln Pfeifen und funktionieren gut als Zeichengeräte . Für Vorgänge, die nicht gelesen und geschrieben werden (z. B. Flusskontrolle auf einer seriellen Leitung), bietet das Gerät Ad-hoc-Befehle mit der Bezeichnung ioctl .
Einige Geräte ähneln ganz normalen Dateien: Sie bestehen aus einer begrenzten Anzahl von Bytes, und was Sie an einer bestimmten Position schreiben, kann später an derselben Position gelesen werden. Diese Geräte werden Blockgeräte genannt .
Netzwerkschnittstellen sind komplexer: Was sie lesen und schreiben, sind keine Bytes, sondern Pakete. Es wäre zwar immer noch möglich, die übliche Schnittstelle mit readund zu verwenden write, aber es wäre umständlich: Vermutlich würde jeder Anruf writeein Paket senden und jeder Anruf readein Paket empfangen (und wenn der Puffer zu klein ist, damit das Paket passt, das paket wäre verloren).
Netzwerkschnittstellen können nur als Geräte vorhanden sein, die sie bereitstellen ioctl. Dies ist in der Tat das, was einige Unix-Varianten tun, aber nicht Linux. Dieser Ansatz hat einige Vorteile. Unter Linux könnten Netzwerkschnittstellen beispielsweise udev nutzen . Die Vorteile sind jedoch begrenzt, weshalb dies nicht getan wurde.
Die meisten netzwerkbezogenen Anwendungen interessieren sich nicht für einzelne Netzwerkschnittstellen, sondern arbeiten auf einer höheren Ebene. Beispielsweise möchte ein Webbrowser TCP-Verbindungen herstellen, und ein Webserver möchte auf TCP-Verbindungen warten. Hierfür wären Geräte für übergeordnete Netzwerkprotokolle, z
Tatsächlich bieten ksh und bash eine solche Schnittstelle für TCP- und UDP-Clients. Im Allgemeinen sind Netzwerkanwendungen jedoch komplexer als Anwendungen für den Dateizugriff. Während der meiste Datenaustausch mit Anrufen analog zu readund durchgeführt wird write, erfordert der Verbindungsaufbau mehr Informationen als nur einen Dateinamen. Das Abhören von TCP-Verbindungen umfasst beispielsweise zwei Schritte: einen, der ausgeführt wird, wenn der Server mit dem Abhören beginnt, und einen, der bei jeder Verbindung eines Clients ausgeführt wird. Solche zusätzlichen Schritte passen nicht gut in die Datei-API. Dies ist der Hauptgrund, warum das Netzwerk eine eigene API hat.
Eine weitere Klasse von Geräten, /devfür die unter Linux normalerweise keine Einträge vorhanden sind (bei einigen anderen Unix-Varianten jedoch), sind Videoadapter. Grundsätzlich könnten einfache Videoadapter als Framebuffer- Geräte verfügbar gemacht werden, bei denen es sich um Blockgeräte handeln könnte, die aus Blöcken bestehen, die die Farbe jedes Pixels darstellen. Beschleunigte Videoadapter könnten als Zeichengeräte dargestellt werden, auf die Anwendungen Befehle senden. Der Nachteil der Geräteschnittstelle besteht darin, dass sie langsam ist: Die anzeigende Anwendung (in der Praxis ein X-Server) müsste bei jeder Anzeige Kernel-Aufrufe ausführen. Stattdessen schreibt der X-Server meistens direkt in den Speicher des Videoadapters, weil er schneller ist.
In der Tat, beschleunigte Videoadapter sind als chardevs über DRI in Linux exportiert. Datei - I / O - Operationen sind nicht notwendigerweise read/ writeentweder; Sie können mmapfür zugeordnete Dateien und direkten Zugriff auf den Gerätespeicher verwenden.
Minmaxavg
11
Sie finden es im /sys/class/netVerzeichnis. it it Symbolische Verknüpfung zu einer anderen Datei in /sys/device/../../. Im Folgenden wird die Ausgabe meiner virtuellen Maschine (Linux-Kernel 3.10) aufgeführt. Und Sie können Befehl verwenden udevadm info <filename>, um sein Attribut zu überprüfen
Willkommen bei U & L. Verwenden Sie immer Anführungszeichen um den Inline-Code, insbesondere wenn Sie einen <>anderen Code verwenden, der als Markup interpretiert wird. (Möglicherweise möchten Sie auch Ihren Namen ändern, um mit einer ASCII-Transkription zu beginnen, da Benutzer mit einfachen Tastaturen Schwierigkeiten haben, das erste Zeichen Ihres Namens als Antwort auf Ihre Kommentare einzugeben.)
Anthon
9
Die AT & T / Solaris-TLI-Methode (Transport Level Interface) für TCP / IP-Netzwerke enthält spezielle Dateien wie "/ dev / tcp" oder "/ dev / udp". Der Programmierer öffnet diese spezielle Datei, um einen Socket einer geeigneten Protokollfamilie abzurufen. Ich denke, das ist der Grund, warum Sie "-lnsl" benötigen, wenn Sie ein Programm kompilieren, das Sockets unter Solaris verwendet. Darunter verbirgt sich TLI.
Linux hat auch /dev/tcpund /dev/udp, obwohl die meisten Kernel es deaktiviert haben.
Bahamat
3
Während Linux traditionell nicht vollständig mit Posix kompatibel war, befolgen Sie geschweige denn alle Open Group-Standards (außerhalb von LSB). Es wurde versucht, mehr UNIX-Funktionalität nach Linux zu portieren.
Glendix ist ein solches Projekt, das einen Port des virtuellen Dateisystems / net von Plan9 anbietet, mit dem Sie genau das tun können, was Sie beschreiben.
read()
undwrite()
die gleiche Art und Weise , dass man es auf eine Datei, aber die Utility - Funktionenrecv()
undsend()
für Sie tun viel mehr Lauferei.Antworten:
Bei vielen Geräten besteht die Hauptoperation darin, Bytes vom Computer an ein Peripheriegerät zu senden oder Bytes von einem Peripheriegerät auf dem Computer zu empfangen. Solche Geräte ähneln Pfeifen und funktionieren gut als Zeichengeräte . Für Vorgänge, die nicht gelesen und geschrieben werden (z. B. Flusskontrolle auf einer seriellen Leitung), bietet das Gerät Ad-hoc-Befehle mit der Bezeichnung ioctl .
Einige Geräte ähneln ganz normalen Dateien: Sie bestehen aus einer begrenzten Anzahl von Bytes, und was Sie an einer bestimmten Position schreiben, kann später an derselben Position gelesen werden. Diese Geräte werden Blockgeräte genannt .
Netzwerkschnittstellen sind komplexer: Was sie lesen und schreiben, sind keine Bytes, sondern Pakete. Es wäre zwar immer noch möglich, die übliche Schnittstelle mit
read
und zu verwendenwrite
, aber es wäre umständlich: Vermutlich würde jeder Anrufwrite
ein Paket senden und jeder Anrufread
ein Paket empfangen (und wenn der Puffer zu klein ist, damit das Paket passt, das paket wäre verloren).Netzwerkschnittstellen können nur als Geräte vorhanden sein, die sie bereitstellen
ioctl
. Dies ist in der Tat das, was einige Unix-Varianten tun, aber nicht Linux. Dieser Ansatz hat einige Vorteile. Unter Linux könnten Netzwerkschnittstellen beispielsweise udev nutzen . Die Vorteile sind jedoch begrenzt, weshalb dies nicht getan wurde.Die meisten netzwerkbezogenen Anwendungen interessieren sich nicht für einzelne Netzwerkschnittstellen, sondern arbeiten auf einer höheren Ebene. Beispielsweise möchte ein Webbrowser TCP-Verbindungen herstellen, und ein Webserver möchte auf TCP-Verbindungen warten. Hierfür wären Geräte für übergeordnete Netzwerkprotokolle, z
Tatsächlich bieten ksh und bash eine solche Schnittstelle für TCP- und UDP-Clients. Im Allgemeinen sind Netzwerkanwendungen jedoch komplexer als Anwendungen für den Dateizugriff. Während der meiste Datenaustausch mit Anrufen analog zu
read
und durchgeführt wirdwrite
, erfordert der Verbindungsaufbau mehr Informationen als nur einen Dateinamen. Das Abhören von TCP-Verbindungen umfasst beispielsweise zwei Schritte: einen, der ausgeführt wird, wenn der Server mit dem Abhören beginnt, und einen, der bei jeder Verbindung eines Clients ausgeführt wird. Solche zusätzlichen Schritte passen nicht gut in die Datei-API. Dies ist der Hauptgrund, warum das Netzwerk eine eigene API hat.Eine weitere Klasse von Geräten,
/dev
für die unter Linux normalerweise keine Einträge vorhanden sind (bei einigen anderen Unix-Varianten jedoch), sind Videoadapter. Grundsätzlich könnten einfache Videoadapter als Framebuffer- Geräte verfügbar gemacht werden, bei denen es sich um Blockgeräte handeln könnte, die aus Blöcken bestehen, die die Farbe jedes Pixels darstellen. Beschleunigte Videoadapter könnten als Zeichengeräte dargestellt werden, auf die Anwendungen Befehle senden. Der Nachteil der Geräteschnittstelle besteht darin, dass sie langsam ist: Die anzeigende Anwendung (in der Praxis ein X-Server) müsste bei jeder Anzeige Kernel-Aufrufe ausführen. Stattdessen schreibt der X-Server meistens direkt in den Speicher des Videoadapters, weil er schneller ist.quelle
read
/write
entweder; Sie könnenmmap
für zugeordnete Dateien und direkten Zugriff auf den Gerätespeicher verwenden.Sie finden es im
/sys/class/net
Verzeichnis. it it Symbolische Verknüpfung zu einer anderen Datei in/sys/device/../../
. Im Folgenden wird die Ausgabe meiner virtuellen Maschine (Linux-Kernel 3.10) aufgeführt. Und Sie können Befehl verwendenudevadm info <filename>
, um sein Attribut zu überprüfenquelle
<>
anderen Code verwenden, der als Markup interpretiert wird. (Möglicherweise möchten Sie auch Ihren Namen ändern, um mit einer ASCII-Transkription zu beginnen, da Benutzer mit einfachen Tastaturen Schwierigkeiten haben, das erste Zeichen Ihres Namens als Antwort auf Ihre Kommentare einzugeben.)Die AT & T / Solaris-TLI-Methode (Transport Level Interface) für TCP / IP-Netzwerke enthält spezielle Dateien wie "/ dev / tcp" oder "/ dev / udp". Der Programmierer öffnet diese spezielle Datei, um einen Socket einer geeigneten Protokollfamilie abzurufen. Ich denke, das ist der Grund, warum Sie "-lnsl" benötigen, wenn Sie ein Programm kompilieren, das Sockets unter Solaris verwendet. Darunter verbirgt sich TLI.
quelle
/dev/tcp
und/dev/udp
, obwohl die meisten Kernel es deaktiviert haben.Während Linux traditionell nicht vollständig mit Posix kompatibel war, befolgen Sie geschweige denn alle Open Group-Standards (außerhalb von LSB). Es wurde versucht, mehr UNIX-Funktionalität nach Linux zu portieren.
Glendix ist ein solches Projekt, das einen Port des virtuellen Dateisystems / net von Plan9 anbietet, mit dem Sie genau das tun können, was Sie beschreiben.
Plan9 Port / Net-Dateisystem auf Linux
quelle