Auf Unix-Systemen gibt es für Pfadnamen in der Regel praktisch keine Längenbeschränkung (also 4096 Zeichen unter Linux) ... außer für Socket-Dateipfade, die auf ungefähr 100 Zeichen begrenzt sind (107 Zeichen unter Linux ).
- Erste Frage: Warum so eine geringe Einschränkung?
Ich habe überprüft, ob es möglich zu sein scheint, diese Einschränkung zu umgehen, indem ich das aktuelle Arbeitsverzeichnis ändere und in verschiedenen Verzeichnissen mehrere Socket-Dateien mit demselben Pfad erstelle ./myfile.sock
: Die Client-Anwendungen scheinen sich korrekt mit den erwarteten Server-Prozessen zu verbinden, obwohl lsof
alle angezeigt werden von ihnen hören auf dem gleichen Socket-Dateipfad.
- Ist diese Problemumgehung zuverlässig oder hatte ich nur Glück?
- Ist dieses Verhalten für Linux spezifisch oder kann diese Problemumgehung auch für andere Unixe angewendet werden?
filenames
socket
limit
unix-sockets
WhiteWinterWolf
quelle
quelle
Antworten:
Kompatibilität mit anderen Plattformen oder Kompatibilität mit älteren Produkten, um Überläufe bei der Verwendung von
snprintf()
und zu vermeidenstrncpy()
.Michael Kerrisk erklärt in seinem Buch auf der Seite 1165 - Kapitel 57, Sockets: Unix-Domain:
Die Jungs von Docker haben sich sogar darüber lustig gemacht, weil einige Sockets 110 Zeichen lang waren:
Aus diesem Grund verwendet LINUX eine 108-Zeichen-Buchse. Könnte dies geändert werden? Na sicher. Und das ist der Grund, warum in erster Linie diese Einschränkung auf älteren Betriebssystemen erstellt wurde:
Zitiere die Antwort:
Andere Betriebssysteme (Unix-Domain-Sockets):
quelle
./my.socket
unter VerzeichnisA/
, und eine andere Socket - Datei auch genannt./my.socket
unten VerzeichnisB/
)?lsof
macht keinen Unterschied zwischen den beiden Socket-Dateien, aber es scheint immer noch zu funktionieren, aber ich frage mich, ob das nur so ist, weil ich Glück habe. Dies ist eine gute Lösung, um Socket-Dateien unter einem Pfad zu erstellen, der bereits länger als die zulässige Größe ist.lsof -U| grep amavis
liefern : (newline)amavis-se 2708 zimbra 17u unix 0xffff8806c0a95400 0t0 310330411 /opt/zimbra/data/tmp/amavisd-zmq.sock
/tmp
mit Tonnen von eindeutig benannten, nicht gelöschten Verzeichnissen überhäufen mit einer einzigen Socket-Datei (absolut hässlich, aber portabel und sicher).In Bezug auf das Warum hat nwildner bereits eine hervorragende Antwort geschrieben .
Hier werde ich mich nur auf das Wie und die relative Pfadnutzung konzentrieren.
Intern kann die Socket-Datei zwar auch nach Namen gesucht werden (glaube ich), sie wird jedoch normalerweise nach Inode gesucht. Unter Linux wird diese Suche durch die
unix_find_socket_byinode()
in net / unix / af_unix.c definierte Funktion sichergestellt .Dies kann leicht wie folgt überprüft werden:
socat
würden Sie einen Befehl verwenden wie:Ich habe dieses Verhalten auf einer Handvoll von Unix-Systemen (Linux Debian, FreeBSD und OpenIndiana, um eine gewisse Diversität zu erzielen) überprüft, so dass dieses Verhalten zumindest weit verbreitet zu sein scheint, wenn nicht sogar Standard.
Absolute Pfade werden normalerweise als Konvention zwischen den Client- und Serverprozessen verwendet, da der Clientprozess sonst möglicherweise nicht weiß, wie die anfängliche Kommunikation mit dem Server hergestellt wird.
Wenn diese anfängliche Kommunikation jedoch kein Problem darstellt, ist es anscheinend sicher, relative Pfade für die Erstellung von Socket-Dateien zu verwenden, um Probleme mit der Pfadlänge zu vermeiden, wenn der Speicherort der Socket-Datei nicht direkt vom Serverprozess gesteuert wird.
quelle