Sockets verwenden unterschiedliche APIs
Das stimmt nicht ganz. Es gibt einige zusätzliche Funktionen für die Verwendung mit Sockets, aber Sie können z. B. normal read()
und write()
auf einem Socket fd verwenden.
Wie trifft das "Alles ist eine Datei" hier zu?
In dem Sinne, dass ein Dateideskriptor beteiligt ist.
Wenn Ihre Definition von "Datei" eine diskrete Folge von Bytes ist, die in einem Dateisystem gespeichert sind, ist nicht alles eine Datei. Wenn Ihre Dateidefinition jedoch handlicher ist - ein Conduit für Informationen, dh eine E / A-Verbindung -, ist "Alles ist eine Datei" sinnvoller. Diese Dinge beinhalten unweigerlich Sequenzen von Bytes, aber woher sie kommen oder wohin sie gehen, kann sich kontextuell unterscheiden.
Es ist jedoch nicht wirklich wörtlich gemeint. Ein Daemon ist keine Datei, ein Daemon ist ein Prozess. Wenn Sie jedoch IPC ausführen, wird Ihre Methode zum Verknüpfen mit einem anderen Prozess möglicherweise durch Entitäten im Dateiformat verringert.
"Alles ist eine Datei" ist nur eine Übertreibung. Es war Roman in der 1970er Jahren und es war ein primäres Unterscheidungsmerkmal von UNIX. Aber es ist nur ein Marketingkonzept, keine wirkliche Grundlage von UNIX, weil es offensichtlich nicht wahr ist. Es ist nicht vorteilhaft oder sinnvoll, ALLES als Datei zu behandeln.
Ist die CPU eine Datei? Liest () Ihr Programm eine CPU, um eine neue Anweisung zu erhalten? Ist RAM eine Datei? Liest Ihr Programm das nächste Byte?
Damals gab es verschiedene Betriebssysteme, die Ihnen eine API für eine Diskette und eine andere API für eine Festplatte, eine andere API für Magnetbänder und eine Reihe verschiedener APIs für verschiedene Terminals usw. gaben. IBM Mainframe-Systeme hatten unterschiedliche Dateitypen auf Festplatten und gaben Ihnen für jeden eine andere API, ob Sie es glauben oder nicht! Der UNIX-Ansatz "Es ist eine Datei" brachte zusammen mit dem Ansatz "stdin / stdout / stderr" eine sehr elegante Abstraktion sowohl für Benutzer als auch für Programmierer.
Mit dem Netzwerk hat diese bestimmte Abstraktion einfach nicht funktioniert. Und es schadet nichts, nur etwas weniger Eleganz und Kohärenz des Betriebssystems. Aber es funktioniert. Sehen Sie eine Datei, die heute
/dev/myinternetz/www/google/com/tcp/80
irgendwo auf Ihrem System aufgerufen wird? Können Sie es öffnen (), eine Abfrage schreiben () und die Antwort in nettem HTML lesen ()? Nein? Dies liegt daran, dass diese Abstraktion "Ist eine Datei" für die Interaktion im Netzwerk nicht sehr praktisch war. In der Praxis würde es nicht allzu gut funktionieren. Gesetz der undichten Abstraktionen in Aktion.quelle
/dev/tcp/www.google.com/80
. Es ist jedoch keine tatsächliche Datei - Bash täuscht sie nur vor./dev/mem
oder/dev/kmem
wenn Sie wollten.Sockets sind Dateien. Sie können
read
undwrite
an einem Socket verwenden: Sie entsprechen dem Aufrufen vonrecv
undsend
mitflags=0
. Sie schließen sie mitclose
. Sie können sie mitdup
und mit Freunden verschieben, wenn Sie Dateideskriptoren mischen müssen. Sie können einige Flags mit setzenfcntl
und nach dem Aufruf stdio buffering verwendenfdopen
. Die Liste geht weiter. Sehr wichtig ist , können Sie anrufenselect
undpoll
auf jede Art von Datei, einschließlich Steckdosen, so dass diese Funktionen ein Programm ermöglichen zu blockieren , bis sie Eingang über irgendwelche Mittel erhält einfach durch Filedeskriptoren auflistet.Es gibt zusätzliche Systemaufrufe für einige Socket - Typen (
recv
undsend
,shutdown
usw.), wie es ein zusätzlicher Systemaufruf für Geräte ist (ioctl
).Nicht alle Dateien haben Namen , und von diesen leben sie nicht immer in der Verzeichnisstruktur. Pipes, die von
pipe
(z. B. in einer Shell-Pipeline) erstellt wurden, und Sockets, die von erstellt wurden,socketpair
haben keine Namen, aber sie sind immer noch Dateien. Sockets, die von erstellt wurden,socket
haben einen Namen, dessen Syntax von der Domäne abhängt. Der Name wird in einem übergebenstruct sockaddr
zubind
und anderen Funktionen. Bei einem Unix (AF_UNIX
) - Socket ist der Name astruct sockaddr_un
, eine Familie und eine Zeichenfolge. Abhängig von der Zeichenfolge kann dies ein Dateiname sein (benannte Sockets können mitmknod
vielen Unix-Varianten erstellt werden) oder nicht (der abstrakte Namespace). Bei einem IPv4 (AF_INET
) - Socket ist der Name einstruct sockaddr_in
, der eine Portnummer und eine IP-Adresse sowie den Namenprotocol
dessocket
Anrufs enthält.quelle
Wenn Sie
stat
ein Socket sind, werden Sie feststellen, dass es eine Inode-Nummer und andere Eigenschaften von regulären Dateien hat. Daher würde ich es als Datei im Dateisystem klassifizieren. Beispiel:17.11. Zusätzliche Informationen für Linux (ext3): Ein Socket hat einen Inode (das ist ein 256-Byte-Block auf der Festplatte), aber keine Datenblöcke (Sie können dies überprüfen, indem Sie den Inode extrahieren und die Datenblockzeiger untersuchen oder indem Sie Ausführen von debugfs 'stat', das einen Blockcount von 0 anzeigt). Es verfügt also über Dateimetadaten (Eigentümer, Gruppe, Berechtigungen usw.), aber keinen Dateninhalt auf der Festplatte. Dies ist identisch mit einer normalen leeren Datei (
touch /tmp/foo
), die ebenfalls eine Blockanzahl von 0 hat. Im ersten Fall zeigt das Feld "Typ" in der Inode "Socket" an. im zweiten Fall wird "normale Datei" angezeigt.Referenzen: ext2 Inode-Struktur ;
stat
,dumpe2fs
Unddebugfs
Befehle.quelle
file
oderstat
darauf zu laufen, macht es zu einer Datei.