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:
- Erstellen Sie zwei Verzeichnisse A / und B / .
- Lassen Sie unter jedem Verzeichnis einen Prozess Socket-Dateien mit demselben Namen abhören. Mit
socat
würden Sie einen Befehl verwenden wie:
$ socat UNIX-LISTEN:./my.sock -
- Tauschen Sie nun die Socket-Dateien aus, indem Sie A / my.sock nach B / verschieben und umgekehrt.
- Von nun an, wenn die Client - Anwendung eine Verbindung herstellt zu A / my.sock wird es den Server kontaktieren Sie B , und wenn es eine Verbindung herstellt B / my.sock wird es den Server kontaktieren A (Hinweis aber , dass , wenn die Kommunikation endet, wird der Server - Prozess kann legitimerweise löschen (was es für eine eigene Socket-Datei hält).
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.