W systemach uniksowych nazwy ścieżek zwykle nie mają praktycznie żadnego ograniczenia długości (cóż, 4096 znaków w systemie Linux) ... z wyjątkiem ścieżek plików gniazd, które są ograniczone do około 100 znaków (107 znaków w systemie Linux ).
- Pierwsze pytanie: dlaczego tak niskie ograniczenie?
Sprawdziłem, czy można obejść to ograniczenie, zmieniając bieżący katalog roboczy i tworząc w różnych katalogach kilka plików gniazd przy użyciu tej samej ścieżki ./myfile.sock
: aplikacje klienckie wydają się poprawnie łączyć z oczekiwanymi procesami serwera, chociaż lsof
pokazuje wszystkie z nich nasłuchuje na tej samej ścieżce pliku gniazda.
- Czy to obejście jest niezawodne, czy miałem szczęście?
- Czy to zachowanie jest specyficzne dla Linuksa, czy może to obejście dotyczy również innych Uniksów?
filenames
socket
limit
unix-sockets
WhiteWinterWolf
źródło
źródło
Odpowiedzi:
Zgodność z innymi platformami lub kompatybilność ze starszymi urządzeniami, aby uniknąć przekroczeń podczas używania
snprintf()
istrncpy()
.Michael Kerrisk wyjaśnia w swojej książce na stronie 1165 - Rozdział 57, Gniazda: Domena Unix:
Ludzie z dokerów nawet się z tego wyśmiewali, ponieważ niektóre gniazda miały długość 110 znaków:
Dlatego LINUX używa gniazda 108 znaków. Czy można to zmienić? Oczywiście. I właśnie dlatego ograniczenie to zostało utworzone w starszych systemach operacyjnych:
Cytując odpowiedź:
Inne systemy operacyjne (gniazda domeny unix):
źródło
./my.socket
poniżej kataloguA/
, a inny plik gniazda o nazwie również./my.socket
poniżej kataloguB/
)?lsof
nie robi rozróżnienia między dwoma plikami gniazd, jednak wydaje się, że nadal działa, ale zastanawiam się, czy to dlatego, że mam szczęście. Byłoby to dobre obejście, aby utworzyć pliki gniazd poniżej ścieżki, która jest już dłuższa niż dozwolony rozmiar.lsof -U| grep amavis
(newline)amavis-se 2708 zimbra 17u unix 0xffff8806c0a95400 0t0 310330411 /opt/zimbra/data/tmp/amavisd-zmq.sock
/tmp
się mnóstwem unikalnie nazwanych katalogów zawierający pojedynczy plik gniazda (całkowicie brzydki, ale przenośny i bezpieczny).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:
socat
użyłbyś polecenia takiego jak: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.
źródło