Что касается того, почему, nwildner уже написал отличный ответ .
Здесь я остановлюсь только на том, как и как использовать относительный путь.
Внутренне, хотя файл сокета также можно искать по имени (я полагаю), он обычно ищется по индоду. В Linux этот поиск обеспечивается функцией, unix_find_socket_byinode()
определенной в net / unix / af_unix.c .
Это можно легко проверить следующим образом:
- Создайте две директории A / и B / .
- В каждом каталоге заставьте процесс прослушивать файлы сокетов с одинаковыми именами. С
socat
вами будет использовать команду, такую как:
$ socat UNIX-LISTEN:./my.sock -
- Теперь обменяйтесь файлами сокетов, переместив A / my.sock в B / и наоборот.
- С этого момента , если клиентское приложение подключается к A / my.sock, оно связывается с сервером B , а если оно подключается к B / my.sock, оно связывается с сервером A (обратите внимание, что, когда связь заканчивается, процесс сервера может законно удалить то, что он считает своим собственным файлом сокета).
Я проверил это поведение в нескольких системах Unix (Linux Debian, FreeBSD и OpenIndiana, чтобы получить некоторое разнообразие), поэтому такое поведение, по-видимому, является по меньшей мере широко распространенным, если не стандартным.
Абсолютные пути обычно используются в качестве соглашения между клиентским и серверным процессами, поскольку клиентский процесс может иначе не знать, как установить начальную связь с сервером.
Однако, если это первоначальное взаимодействие не является проблемой, представляется безопасным использование относительных путей для создания файлов сокетов, что позволяет избежать проблем с длиной пути, когда местоположение файла сокета напрямую не контролируется процессом сервера.