Gibt es eine Datei für jeden Socket?

21

"Alles ist eine Datei" in der UNIX-Welt.

Der obige Satz ist berühmt. Wenn ich renne echo "hello programmer" >> /dev/tty1, kann ich mir die angegebene Zeichenfolge ansehen TeleType 1 , ....

Was und wo ist die Datei für jede Datei socket? Angenommen, mein Freund stellt eine Verbindung zu meinem PC her und die IP lautet h.h.h.h: Wie kann ich auf die entsprechende Datei zugreifen? Ist es möglich?

Persischer Golf
quelle
3
Die Socket-API ist in dieser Hinsicht eine Abweichung von der "Unix-Richtlinie", da sie ursprünglich von BSD stammte . Beachten Sie, dass es immer Plan 9 von Bell Labs gibt, der "mehr Unix als Unix" ist - sogar die Netzwerk- und Grafik-APIs sind Dateien dort.
ntoskrnl
Sockets und Prozesse werden in Plan 9-Veröffentlichungen häufig erwähnt. Dabei geht es hauptsächlich um die Fehlerursache des UNIX-Modells.
Strugee

Antworten:

9

Mann 7 Unix:

Die Socket-Familie AF_UNIX (auch als AF_LOCAL bezeichnet) wird zur effizienten Kommunikation zwischen Prozessen auf demselben Computer verwendet. Herkömmlicherweise können UNIX-Domain-Sockets entweder unbenannt oder an einen Dateisystem-Pfadnamen gebunden sein (als vom Typ Socket gekennzeichnet). Linux unterstützt auch einen abstrakten Namespace, der vom Dateisystem unabhängig ist.

Dh nicht jeder Socket kann als Datei angesehen werden (im Sinne von "keine Datei ohne Dateinamen").

Es gibt aber Dateien mit Listen von Sockets (zB /proc/net/tcp); Nicht genau das, was "alles ist eine Datei" bedeutet.

Hauke ​​Laging
quelle
38

Ein Socket ist eine Datei. Aber nicht alle Dateien haben Namen. Hier einige Beispiele für Dateien ohne Namen:

  • Alle Dateien, die früher einen Namen hatten und jetzt gelöscht werden, aber noch von einem Programm geöffnet werden.
  • Eine unbenannte Pipe , wie sie vom |Shell-Operator erstellt wurde.
  • Die meisten Sockets : Jeder Internet-Socket oder ein Unix-Socket, der sich nicht im Namespace des Dateisystems befindet (er kann im abstrakten Namespace oder unbenannt sein).

Dateien wie unbenannte Pipes oder Sockets werden von einem Prozess erstellt und können nur in diesem Prozess oder in anschließend erstellten untergeordneten Prozessen aufgerufen werden. (Dies ist nicht ganz richtig: Ein Prozess, bei dem eine Pipe oder ein Socket (oder eine andere Datei) geöffnet ist, kann sie über einen Unix-Socket an andere Prozesse übertragen. Dies wird als Datei-Deskriptor-Übergabe bezeichnet .)

Sockets, die einen Namen haben (ob im Dateisystem oder abstrakt), können unter diesem Namen geöffnet werden. Netzwerk-Sockets können von jedem Computer mit entsprechender Konnektivität entfernt geöffnet (oder genauer gesagt verbunden) werden.

Gilles 'SO - hör auf böse zu sein'
quelle
Das ist die richtige Antwort.
Jforberg
4
/proc/<pid>/fd/*und /proc/net/*vielleicht interessant
n611x007
Bitte akzeptieren Sie diese Antwort. Es ist meiner Meinung nach viel genauer.
user1202136
13

Was und wo ist die Datei pro Socket?

"Alles" ist übertrieben. Es ist keine strenge Richtlinie, es ist nur eine gängige Praxis, das Dateisystem für Schnittstellen zu verwenden, da der Dateisystemzugriff ein Synonym für Systemaufrufe ist (dh das Dateisystem ist wirklich eine Schnittstelle zum Kernel und bietet daher ein praktisches Format für alle Arten von Dingen). . Andere Betriebssysteme machen davon nicht so viel Gebrauch, daher wird es als Unterscheidungsmerkmal angesehen.

Wie Hauke ​​Laging erwähnt, haben "unix local" Sockets wie Named Pipes einen Dateiknoten (siehe man fifo). Internet-Protokoll-Sockets (die für die Netzwerkkommunikation verwendet werden) tun dies jedoch nicht. Stattdessen werden sie im Benutzerbereich mit einer Portnummer verknüpft. Beachten Sie, dass ein Server-Socket an einem einzelnen Port mehrere Clients mit jeweils einem eigenen Socket verbindet (eine einzelne lokale Unix-Socket-Datei kann auf diese Weise auch mit einem Server verwendet werden, dh, es können mehrere Sockets mit derselben Dateiadresse verknüpft sein). und im Code werden sie tatsächlich einzeln über separate numerische Dateideskriptoren identifiziert .

Also, in diesem Sinne alle Steckdosen sind ähnlich wie Dateien und einen Link in /proc/[pid]/fd/. Sie können readlink()diese Inode sogar aufrufen und eine spezielle Art von Dateinamen abrufen , die in Befehlszeilentools verwendet wird, wie z lsof. Ebenso können Sie sich über den Socket-Deskriptor informieren fstat().

Goldlöckchen
quelle
Du meinst "im Userspace durch deren Inode identifiziert"? Nicht jeder Socket hat eine Portnummer und es kann mehrere Sockets für dieselbe Portnummer geben (macht aber keinen Sinn).
Hauke ​​Laging
@HaukeLaging: Guter Punkt. Ich habe sie bearbeitet, um dies ab dem zweiten Absatz klarer zu machen.
Goldlöckchen