Về lý do tại sao, nwildner đã viết một câu trả lời tuyệt vời .
Ở đây tôi sẽ chỉ tập trung vào cách sử dụng và đường dẫn tương đối.
Trong nội bộ, trong khi tệp socket cũng có thể được tra cứu theo tên (tôi đoán), chúng thường được tra cứu bằng inode. Trong Linux, việc tra cứu này được đảm bảo bởi chức năng unix_find_socket_byinode()
được xác định trong net / unix / af_unix.c .
Điều này có thể dễ dàng kiểm tra như sau:
- Tạo hai thư mục A / và B / .
- Trong mỗi thư mục, tạo một quá trình lắng nghe trên các tệp ổ cắm có cùng tên. Với
socat
bạn sẽ sử dụng một lệnh như:
$ socat UNIX-LISTEN:./my.sock -
- Bây giờ trao đổi các tệp ổ cắm bằng cách di chuyển A / my.sock sang B / và ngược lại.
- Từ giờ trở đi, nếu ứng dụng khách kết nối với A / my.sock, nó sẽ liên lạc với máy chủ B và nếu kết nối với B / my.sock, nó sẽ liên lạc với máy chủ A (lưu ý rằng khi giao tiếp kết thúc, quá trình máy chủ có thể xóa một cách hợp pháp những gì nó nghĩ là tập tin ổ cắm của chính nó).
Tôi đã kiểm tra hành vi này trên một số ít hệ thống Unix (Linux Debian, FreeBSD và OpenIndiana để có được sự đa dạng), vì vậy hành vi này dường như ít phổ biến rộng rãi, nếu không phải là tiêu chuẩn.
Đường dẫn tuyệt đối thường được sử dụng như một quy ước giữa máy khách và máy chủ xử lý, vì quá trình máy khách có thể không biết cách thiết lập giao tiếp ban đầu với máy chủ.
Tuy nhiên, nếu giao tiếp ban đầu này không phải là vấn đề, thì có vẻ an toàn khi sử dụng các đường dẫn tương đối để tạo tệp ổ cắm, cho phép tránh các vấn đề về độ dài đường dẫn khi vị trí tệp ổ cắm không được điều khiển trực tiếp bởi quá trình máy chủ.