В Unix-системах имена путей обычно практически не имеют ограничений по длине (ну, 4096 символов в Linux) ... за исключением путей к файлам сокетов, которые ограничены примерно 100 символами (107 символов в Linux ).
- Первый вопрос: почему такие низкие ограничения?
Я проверил, что кажется возможным обойти это ограничение, изменив текущий рабочий каталог и создав в разных каталогах несколько файлов сокетов, использующих один и тот же путь ./myfile.sock
: клиентские приложения, похоже, правильно подключаются к ожидаемым процессам сервера, хотя и lsof
отображают все из них прослушивание по одному и тому же пути к файлу сокета.
- Этот обходной путь надежен или мне просто повезло?
- Это поведение специфично для Linux или этот обходной путь применим также и к другим Unix?
filenames
socket
limit
unix-sockets
WhiteWinterWolf
источник
источник
Ответы:
Совместимость с другими платформами или совместимость со старыми компонентами, чтобы избежать переполнения при использовании
snprintf()
иstrncpy()
.Майкл Керриск объясняет в своей книге на странице 1165 - Глава 57, Сокеты: домен Unix:
Парни из Docker даже посмеялись над этим, потому что некоторые сокеты имели длину 110 символов:
Вот почему LINUX использует гнездо с 108 символами. Можно ли это изменить? Конечно. И это причина, по которой в первую очередь это ограничение было создано на старых операционных системах:
Цитирую ответ:
Другие ОС (доменные сокеты Unix):
источник
./my.socket
ниже каталогаA/
, а другой файл сокетов также с именем./my.socket
ниже каталогаB/
)?lsof
не делает никаких различий между двумя файлами сокетов, однако, похоже, все еще работает, но мне интересно, если это только потому, что мне повезло. Это был бы хороший обходной путь для создания файлов сокетов ниже пути, который уже длиннее допустимого размера.lsof -U| grep amavis
amavis-se 2708 zimbra 17u unix 0xffff8806c0a95400 0t0 310330411 /opt/zimbra/data/tmp/amavisd-zmq.sock
/tmp
тоннами неповрежденных каталогов с уникальными именами каждый содержащий один файл сокета (совершенно безобразный, но переносимый и безопасный).Что касается того, почему, nwildner уже написал отличный ответ .
Здесь я остановлюсь только на том, как и как использовать относительный путь.
Внутренне, хотя файл сокета также можно искать по имени (я полагаю), он обычно ищется по индоду. В Linux этот поиск обеспечивается функцией,
unix_find_socket_byinode()
определенной в net / unix / af_unix.c .Это можно легко проверить следующим образом:
socat
вами будет использовать команду, такую как:Я проверил это поведение в нескольких системах Unix (Linux Debian, FreeBSD и OpenIndiana, чтобы получить некоторое разнообразие), поэтому такое поведение, по-видимому, является по меньшей мере широко распространенным, если не стандартным.
Абсолютные пути обычно используются в качестве соглашения между клиентским и серверным процессами, поскольку клиентский процесс может иначе не знать, как установить начальную связь с сервером.
Однако, если это первоначальное взаимодействие не является проблемой, представляется безопасным использование относительных путей для создания файлов сокетов, что позволяет избежать проблем с длиной пути, когда местоположение файла сокета напрямую не контролируется процессом сервера.
источник