Heim >Betrieb und Instandhaltung >Betrieb und Wartung von Linux >Einführung in Dateitypen unter Linux
Der Inhalt dieses Artikels besteht darin, verschiedene Dateitypen unter Linux vorzustellen. Ich hoffe, dass er für Freunde hilfreich ist. [Video-Tutorial-Empfehlung: Linux-Tutorial]
Unter dem Linux-System gibt es sieben Dateitypen:
Gewöhnliche Dateien ( - )
Verzeichnis (d)
Softlink (Zeichenlink L)
Socket-Datei(en)
Zeichengerät(e)
Gerät blockieren (B)
Pipe-Datei (benannte Pipe P)
Normale Dateien, Verzeichnisse und Softlinks bedürfen keiner weiteren Erklärung. Werfen wir einen Blick auf Pipe-Dateien, Socket-Dateien, Zeichengeräte und Blockgerätetypen.
Pipes werden in anonyme Pipes und benannte Pipes unterteilt. Pipes werden an einem Ende geschrieben und am anderen Ende gelesen. Ihre Daten werden direkt im Speicher übertragen, z. B. beim Schreiben von übergeordneten Prozessen und beim Lesen von untergeordneten Prozessen. .
In der Shell ist die anonyme Pipe ein Pipe-Symbol „|“, z. B. ls | grep xxx
, wobei der Prozess, der ls entspricht, der übergeordnete Prozess in dieser unabhängigen Prozessgruppe ist und der Prozess, der grep entspricht, der übergeordnete Prozess ist Der untergeordnete Prozess schreibt die Lesevorgänge des untergeordneten Prozesses.
In Programmiersprachen werden anonyme Pipes implementiert, indem zwei Dateihandles oder Dateideskriptoren (z. B. A, B) erstellt werden. Ein Dateihandle wird zum Schreiben von Daten verwendet (z. B. A-Schreibende, Daten-Schreibende Eingabe von A). schiebt es automatisch nach B) und ein anderes Dateihandle wird zum Lesen der Daten verwendet (d. h. B).
Für Named Pipes, also Pipes mit Namen, behalten Named Pipes Dateien im Dateisystem, es wird auch FIFO genannt, was „First In First Out“ bedeutet. Obwohl die Named-Pipe-Datei im Dateisystem gespeichert bleibt, ist diese Datei nur ein Einstiegspunkt für die Verwendung der Named-Pipe. Wenn die Named-Pipe zum Übertragen von Daten verwendet wird, erfolgt die Ausführung weiterhin im Speicher, was bedeutet, dass sie nicht gespeichert wird Das Dateisystem ist weniger effizient.
In der Shell können Sie den Befehl mknod
oder den Befehl mkfifo
verwenden, um eine Named Pipe zu erstellen. Named Pipes sind sehr nützlich, wenn Sie Shell-Skripte mit bestimmten speziellen Anforderungen schreiben. Tatsächlich wird die Funktion von Coroutinen (mit dem Befehl coproc) seit Bash 4 unterstützt (ksh und zsh unterstützen Coroutinen seit langem), aber die Anforderungen von Coroutinen können über Named Pipes realisiert werden.
Allgemeine Pipes sind unidirektionale Kommunikation und können die Funktion der bidirektionalen Kommunikation nicht realisieren, das heißt, sie können nur gleichzeitig schreiben und lesen, aber nicht auf beiden Seiten lesen und schreiben. Wenn Sie eine bidirektionale Kommunikation erreichen möchten, können Sie zwei Pipes erstellen (also vier Dateihandles, zwei Leseenden und zwei Schreibenden) oder einen bequemeren Socket verwenden.
Socket wird verwendet, um die Kommunikation zwischen beiden Enden zu realisieren. Wie oben analysiert, kann es die prozessübergreifende Kommunikationsfunktion einer bidirektionalen Pipeline realisieren. Darüber hinaus können Sockets auch die prozessübergreifende Kommunikation zwischen Hosts über das Netzwerk realisieren.
Sockets müssen gepaart sein, um sinnvoll zu sein, das heißt, sie sind in zwei Enden unterteilt. Jedes Ende verfügt über einen Dateideskriptor (oder Dateihandle) zum Lesen und Schreiben, was einer bidirektionalen Kommunikation entspricht Rohre.
Sockets werden entsprechend der Protokollfamilie in zwei Kategorien unterteilt: Netzwerk-Sockets (Typ AF_INET, unterteilt in inet4 und inet6 entsprechend ipv4 und ipv6) und Unix-Domänen-Sockets (Typ AF_UNIX). Natürlich können Sockets von der Protokollfamilie abwärts in viele Typen unterteilt werden. Beispielsweise können INET-Sockets in TCP-Sockets, UDP-Sockets, Link-Layer-Sockets, Raw-Sockets usw. unterteilt werden. Unter diesen sind Netzwerk-Sockets die Grundlage und der Kern der Netzwerkprogrammierung.
Für die Kommunikation zwischen Prozessen auf einem einzelnen Computer ist es besser, den Unix-Domänen-Socket als den Inet-Socket zu verwenden, da der Unix-Domänen-Socket keine Netzwerkkommunikationskomponente hat, und zwar nur Es fehlen viele Netzwerkfunktionen und es ist leichter. Tatsächlich werden die von einigen Sprachen auf bestimmten Betriebssystemplattformen implementierten Pipeline-Funktionen über die Unix-Domäne implementiert, und man kann sich ihre hohe Effizienz vorstellen.
Der Unix-Domänen-Socket verfügt über zwei Dateihandles (z. B. A, B). Beide Dateihandles sind gleichzeitig lesbar und beschreibbar. Wenn Prozess 1 Daten nach A schreibt, werden diese automatisch nach B gepusht. Prozess 2 kann die von A geschriebenen Daten von B lesen. Wenn Prozess 2 Daten nach B schreibt, werden sie automatisch nach A gepusht. Prozess 1 kann lesen die von B von A geschriebenen Daten. Wie folgt:
进程1 进程2 ------------------------ A -----------> B B -----------> A
In Programmiersprachen verfügt das Erstellen eines Unix-Domain-Sockets natürlich über entsprechende Funktionen, um es einfach zu erstellen (kann man socketpair
sein). Für die Bash-Shell können Sie sie über den Befehl nc
(NetCat) erstellen oder einfach zwei Named Pipes verwenden, um die entsprechenden Funktionen zu implementieren. Bei Bedarf können Sie lernen, wie Sie Unix-Domain-Sockets in der Bash-Shell verwenden.
Für die prozessübergreifende Kommunikation über ein Netzwerk sind Netzwerk-Sockets erforderlich. Jeder Netzwerk-Socket besteht aus 5 Teilen, die als 5-Tupel des Sockets bezeichnet werden. Das Format ist wie folgt:
{protocol, src_addr, src_port, dest_addr, dest_port}
d. h. Protokoll, Quelladresse, Quellport, Zieladresse, Zielport.
Jedes Ende des Sockets hat zwei Puffer im Kernelraum (das heißt, ein Paar Sockets hat 4 Puffer), und jedes Ende hat einen Empfangspuffer und einen Sendepuffer. Prozess 1 schreibt Daten in den Sendepuffer seines eigenen Sockets, die an den Empfangspuffer des Peers gesendet werden, und dann kann Prozess 2 des Peers Daten aus dem Empfangspuffer lesen und umgekehrt.
Aber bevor Sie den Netzwerk-Socket tatsächlich lesen und schreiben können, benötigt der Netzwerk-Socket noch einige Einstellungen. Nachdem der Server-Socket erstellt wurde (Socket ()-Funktion, gibt es ein Dateihandle oder einen Dateideskriptor für Lese- und Schreibvorgänge), muss er auch die Adresse (über die Funktion bind ()) und den Überwachungsport (über listen () binden. )-Funktion), muss der Client nur den Socket erstellen und direkt die Funktion connect() verwenden, um eine Verbindungsanforderung an den Server-Socket zu initiieren.
Wenn der Client bei TCP-Sockets eine Verbindungsanforderung initiiert, bedeutet dies, dass er einen Drei-Wege-Handshake mit dem Server durchführen muss (wird vom Kernel ausgeführt und hat nichts mit dem User-Space-Prozess zu tun). Teilen Sie jeden dieser drei Handshakes auf. Wenn der Client zum ersten Mal eine SYN-Anfrage sendet, stellt der Kernel die Verbindung in die Syn-Warteschlange, setzt den Status auf syn-recv und sendet dann ack+syn an Auf der Clientseite verschiebt der Kernel nach Erhalt der Antwortbestätigung des Clients die Verbindung von der Syn-Warteschlange in die eingerichtete Warteschlange (oder Akzeptanzwarteschlange) und markiert den Status der Verbindung als hergestellt. Schließlich initiiert der auf Benutzerbereich wartende Prozess den Systemaufruf „accept()“, damit der Kernel ihn aus der Akzeptanzwarteschlange entfernen kann. Die Verbindung nach der Annahme () zeigt an, dass die Verbindung hergestellt wurde, wodurch die Datenübertragung zwischen den Prozessen an beiden Enden tatsächlich realisiert werden kann.
Weitere Informationen zu den Prinzipien von TCP-Sockets finden Sie in meinem anderen Artikel: Der Socket- und TCP-Verbindungsprozess, den man kennen muss.
Blockgeräte sind Hardwaregeräte, die sich durch zufälligen (nicht unbedingt sequenziellen) Zugriff auf Datenblöcke fester Größe auszeichnen. Ein Chunk mit fester Größe wird als Block bezeichnet. Das häufigste Blockgerät ist die Festplatte, aber es gibt auch viele andere Blockgeräte, wie zum Beispiel Diskettenlaufwerke, Blu-ray-Lesegeräte und Flash-Speicher. Beachten Sie, dass es sich dabei um Geräte handelt, auf denen Dateisysteme gemountet sind, und dass Dateisysteme wie eine Verkehrssprache für Blockgeräte sind.
Der Zugriff auf Zeichengeräte erfolgt über einen kontinuierlichen Datenstrom, Byte für Byte. Typische Zeichengeräte sind Terminals (es gibt viele Arten von Terminals, sowohl physische als auch virtuelle) und Tastaturen .
Der einfachste Weg, Blockgeräte und Zeichengeräte zu unterscheiden, besteht darin, sich die Art und Weise anzusehen, wie auf Daten zugegriffen wird. Auf Blockgeräte kann nach dem Zufallsprinzip zugegriffen werden, um Daten zu erhalten, und auf Zeichengeräte muss in Bytereihenfolge zugegriffen werden.
Wenn Sie hier ein paar Daten lesen können, dort ein paar Daten lesen und sie schließlich zu einem kontinuierlichen Datenstück verketten können, dann ist dies ein Blockgerät, genau wie die Daten auf der Festplatte diskontinuierlich sind Möglicherweise muss über eine Direktzugriffsmethode zugegriffen werden, um ein Datenelement zu erhalten. Beispielsweise können sich in einer etwas größeren Datei auf einer Festplatte die ersten 10.000 Daten in zusammenhängenden Datenblöcken oder in zusammenhängenden Sektoren befinden, und die nächsten 10.000 Daten können weit davon entfernt oder sogar auf verschiedenen Zylindern liegen.
Wenn jedes Byte in einem Datenelement dieselbe Bytereihenfolge wie beim Zugriff aufweist, d. h. die Bytereihenfolge vom Zeitpunkt des Zugriffs bis zur endgültigen Verarbeitung der Daten vollständig konsistent ist, dann Dies ist ein Zeichengerät. Mit anderen Worten: Zeichengeräte können als Stream-Geräte betrachtet werden. Genau wie bei der Eingabe von Daten auf einer Tastatur müssen beim kontinuierlichen Drücken zweier Tasten die diesen beiden Tasten entsprechenden Bytedaten beim Empfang zuerst vorne und dann hinten eingegeben werden. Ebenso funktioniert das Endgerät. Wenn das Programm Daten an das Terminal ausgibt, gibt das Programm zuerst den Buchstaben a und dann die Zahl 3 aus. Bei der Anzeige auf dem Terminal muss dann a vorne und 3 innen stehen die Rückseite.
Das obige ist der detaillierte Inhalt vonEinführung in Dateitypen unter Linux. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!