"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?
Antworten:
Mann 7 Unix:
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.quelle
Ein Socket ist eine Datei. Aber nicht alle Dateien haben Namen. Hier einige Beispiele für Dateien ohne Namen:
|
Shell-Operator erstellt wurde.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.
quelle
/proc/<pid>/fd/*
und/proc/net/*
vielleicht interessant"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önnenreadlink()
diese Inode sogar aufrufen und eine spezielle Art von Dateinamen abrufen , die in Befehlszeilentools verwendet wird, wie zlsof
. Ebenso können Sie sich über den Socket-Deskriptor informierenfstat()
.quelle