Jeśli chodzi o to, nwildner napisał już doskonałą odpowiedź .
Tutaj skupię się na tym, jak i względne użycie ścieżki.
Wewnętrznie, chociaż plik gniazda można również wyszukać według nazwy (tak sądzę), zwykle są one wyszukiwane według i-węzła. W Linuksie to wyszukiwanie zapewnia funkcja unix_find_socket_byinode()
zdefiniowana w net / unix / af_unix.c .
Można to łatwo sprawdzić w następujący sposób:
- Utwórz dwa katalogi A / i B / .
- W każdym katalogu uruchom proces nasłuchiwania plików gniazd o tej samej nazwie. Z
socat
użyłbyś polecenia takiego jak:
$ socat UNIX-LISTEN:./my.sock -
- Teraz wymień pliki gniazd, przenosząc A / my.sock do B / i odwrotnie.
- Odtąd, jeśli aplikacja kliencka połączy się z A / my.sock , skontaktuje się z serwerem B , a jeśli połączy się z B / my.sock , skontaktuje się z serwerem A (pamiętaj jednak, że po zakończeniu komunikacji proces serwera może zgodnie z prawem usuń to, co uważa za własny plik gniazda).
Sprawdziłem to zachowanie na kilku systemach uniksowych (Linux Debian, FreeBSD i OpenIndiana, aby uzyskać pewną różnorodność), więc to zachowanie wydaje się być co najmniej szeroko rozpowszechnione, jeśli nie standardowe.
Ścieżki bezwzględne są zwykle używane jako konwencja między procesami klienta i serwera, ponieważ proces klienta może nie wiedzieć, jak ustanowić początkową komunikację z serwerem.
Jeśli jednak ta początkowa komunikacja nie stanowi problemu, wydaje się, że bezpieczne jest używanie ścieżek względnych do tworzenia plików gniazd, co pozwala uniknąć problemów z długością ścieżek, gdy lokalizacja pliku gniazda nie jest bezpośrednio kontrolowana przez proces serwera.