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.
Pipe-Datei
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
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.
Unix-Domänen-Socket
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.
Netzwerk-Sockets
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 und Zeichengeräte
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Um eine Web.xml -Datei zu öffnen, können Sie die folgenden Methoden verwenden: Verwenden Sie einen Texteditor (z.

Multithreading in der Sprache kann die Programmeffizienz erheblich verbessern. Es gibt vier Hauptmethoden, um Multithreading in C -Sprache zu implementieren: Erstellen Sie unabhängige Prozesse: Erstellen Sie mehrere unabhängig laufende Prozesse. Jeder Prozess hat seinen eigenen Speicherplatz. Pseudo-MultitHhreading: Erstellen Sie mehrere Ausführungsströme in einem Prozess, der denselben Speicherplatz freigibt und abwechselnd ausführt. Multi-Thread-Bibliothek: Verwenden Sie Multi-Thread-Bibliotheken wie PThreads, um Threads zu erstellen und zu verwalten, wodurch reichhaltige Funktionen der Thread-Betriebsfunktionen bereitgestellt werden. Coroutine: Eine leichte Multi-Thread-Implementierung, die Aufgaben in kleine Unteraufgaben unterteilt und sie wiederum ausführt.

Linux wird am besten als Serververwaltung, eingebettete Systeme und Desktop -Umgebungen verwendet. 1) In der Serververwaltung wird Linux verwendet, um Websites, Datenbanken und Anwendungen zu hosten und Stabilität und Zuverlässigkeit bereitzustellen. 2) In eingebetteten Systemen wird Linux aufgrund seiner Flexibilität und Stabilität in Smart Home und Automotive Electronic Systems häufig verwendet. 3) In der Desktop -Umgebung bietet Linux reichhaltige Anwendungen und eine effiziente Leistung.

Die Hauptgründe, warum Sie sich bei MySQL nicht als Root anmelden können, sind Berechtigungsprobleme, Konfigurationsdateifehler, Kennwort inkonsistent, Socket -Dateiprobleme oder Firewall -Interception. Die Lösung umfasst: Überprüfen Sie, ob der Parameter Bind-Address in der Konfigurationsdatei korrekt konfiguriert ist. Überprüfen Sie, ob die Root -Benutzerberechtigungen geändert oder gelöscht und zurückgesetzt wurden. Stellen Sie sicher, dass das Passwort korrekt ist, einschließlich Fall- und Sonderzeichen. Überprüfen Sie die Einstellungen und Pfade der Socket -Dateiberechtigte. Überprüfen Sie, ob die Firewall Verbindungen zum MySQL -Server blockiert.

Muss ich einen Oracle -Client installieren, wenn ich mit GO eine Verbindung zu einer Oracle -Datenbank herstellen kann? Bei der Entwicklung in Go ist die Verbindung zu Oracle -Datenbanken eine übliche Anforderung ...

Ich habe ein Projekt namens Lua-Libuv entwickelt und freue mich, meine Erfahrungen zu teilen. Die ursprüngliche Absicht des Projekts besteht darin, zu untersuchen, wie Libuv (eine in C geschriebene asynchrone E/A -Bibliothek) verwendet wird, um einen einfachen HTTP -Server zu erstellen, ohne die C -Sprache ausführlich lernen zu müssen. Mit Hilfe von ChatGPT habe ich den Basiscode von http.c. Beim Umgang mit anhaltenden Verbindungen habe ich zum richtigen Zeitpunkt erfolgreich die Schließung der Verbindung und die Freilegung von Ressourcen implementiert. Zuerst habe ich versucht, einen einfachen Server zu erstellen, der das Hauptprogramm beendete, indem ich die Verbindung schließt, aber ich hatte einige Probleme. Ich habe versucht, Datenblöcke mit Streaming zu senden, und während es funktioniert, blockiert dies den Haupt -Thread. Am Ende habe ich mich entschlossen, diesen Ansatz aufzugeben, weil mein Ziel nicht darin bestand, eine Tiefe der C -Sprache zu lernen. Endlich, ich

C-Sprachbedingungskompilation ist ein Mechanismus zum selektiven Kompilieren von Codeblöcken, die auf Kompilierungszeitbedingungen basieren. Zu den Einführungsmethoden gehören: Verwenden von #IF- und #else -Direktiven, um Codeblöcke basierend auf den Bedingungen auszuwählen. Zu den häufig verwendeten bedingten Ausdrücken gehören STDC, _win32 und Linux. Praktischer Fall: Drucken Sie verschiedene Nachrichten entsprechend dem Betriebssystem. Verwenden Sie unterschiedliche Datentypen gemäß der Anzahl der Ziffern des Systems. Verschiedene Header -Dateien werden gemäß dem Compiler unterstützt. Die bedingte Kompilierung verbessert die Portabilität und Flexibilität des Codes und macht es an den Compiler-, Betriebssystem- und CPU -Architekturänderungen anpassbar.

1.0.1 Vorwort Dieses Projekt (einschließlich Code und Kommentare) wurde während meines Autodidakt-Rostes aufgezeichnet. Es kann ungenaue oder unklare Aussagen geben. Bitte entschuldigen Sie sich. Wenn Sie davon profitieren, ist es noch besser. 1.0.2 Warum ist Rustrust zuverlässig und effizient? Rost kann C und C mit ähnlicher Leistung, aber höherer Sicherheit ersetzen, und erfordert keine häufige Neukompilation, um auf Fehler wie C und C zu prüfen. Thread-Safe (stellen Sie sicher, dass Multi-Thread-Code vor der Ausführung sicher ist). Vermeiden Sie undefiniertes Verhalten (z. B. Array aus Grenzen, nicht initialisierte Variablen oder Zugriff auf den freien Speicher). Rust bietet moderne Sprachmerkmale wie Generika
