Щодо того, чому, nwildner вже написав чудову відповідь .
Тут я зупинюсь лише на тому, як і відносне використання шляху.
Внутрішньо, хоча файл сокета також можна шукати за назвою (я думаю), їх зазвичай шукають по inode. У 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, щоб отримати певну різноманітність), тому така поведінка здається принаймні широко розповсюдженою, якщо не стандартною.
Абсолютні шляхи зазвичай використовуються як умова між клієнтом і серверними процесами, оскільки клієнтський процес може інакше не знати, як встановити початковий зв’язок із сервером.
Однак, якщо ця початкова комунікація не є проблемою, тому здається безпечним використовувати відносні шляхи для створення файлів сокетів, що дозволяє уникнути проблем із довжиною шляху, коли розташування файлу сокета безпосередньо не контролюється сервером.