2016-01-16 12 views
11

Khi tạo ổ cắm unix, tên đường dẫn (man 7 unix) được phép dài tối đa 108 ký tự. Đối với một người bạn điều này gây ra một lỗi trong chương trình của mình bởi vì con đường của ông đã lâu hơn. Bây giờ chúng ta tự hỏi chính xác con số đó đã được xác định như thế nào.Tại sao chiều dài đường dẫn tối đa được phép cho unix-socket trên linux 108?

Tôi có nghi ngờ rằng số được xác định sao cho số sizeof của cấu trúc đó sockaddr_un rõ ràng so với kích thước của các địa chỉ sockaddress khác như sockaddr_in. Nhưng nếu họ muốn tránh xung đột với các giá trị sizeof khác, tại sao không sử dụng số nguyên tố chẳng hạn? Ai đó có thể vui lòng cung cấp nguồn ủy quyền cho điều đó không?

+2

Tại sao số nguyên tố sẽ tránh được kích thước của các loại khác? –

+0

@EdHeal Có lẽ tôi đã nhầm lẫn nhưng việc thêm bội số của 2 (do sắp xếp) sẽ không còn tạo ra cấu trúc phù hợp với kích thước của nó. Ngoài ra tôi có thể hỏi, tại sao lại sử dụng một số chẵn, nếu mục tiêu là tránh đụng độ? Điều đó dường như chỉ ra rằng sự nghi ngờ của tôi về con số có thể không chính xác. –

+1

Cấp rất nhiều cấu trúc là nhiều của twos (có lẽ một nửa trong số họ). Nhưng làm cho một cái gì đó kích thước của một số nguyên tố không tránh đụng độ. Dù sao điểm làm việc này là gì nếu lập trình viên nhận được phần cơ bản này sai và sử dụng cấu trúc sai. –

Trả lời

3

Nếu bạn không thể tìm thấy nó đôi khi nó chỉ có nghĩa là không có gì để tìm. Nhưng nó cũng có nghĩa là bạn không thể tìm thấy nó. Tuy nhiên, tôi muốn chia sẻ những gì tôi đã tìm thấy cho đến thời điểm này và

Tôi làm cho khó đoán rằng số đó là không tách rời.

tôi đoán được hỗ trợ bởi hai báo cáo từ GNU C Library:

char sun_path[108]

Đây là tên tập tin để sử dụng. Chưa hoàn tất: Tại sao 108 số ma thuật? RMS đề xuất làm cho mảng này có độ dài bằng 0 và tinh chỉnh ví dụ sau để sử dụng alloca để phân bổ dung lượng lưu trữ thích hợp dựa trên độ dài của tên tệp.

(Trong trường hợp RMS nên Richard M. Stallman (khác đoán))

ngày Loại: struct sockaddr
...

char sa_data[14]

Đây là thực tế dữ liệu địa chỉ socket, phụ thuộc vào định dạng. Chiều dài của nó cũng là tùy thuộc vào định dạng và có thể dài hơn 14. Chiều dài 14 của sa_data về bản chất là tùy ý.

PS: Không biết tại sao nhưng loại câu hỏi này khiến tôi thực sự tò mò.

4

Nó phù hợp với không gian có sẵn trong cấu trúc dữ liệu hạt nhân tiện dụng.

EDIT:

Trích dẫn "Các Thiết kế và Thực hiện các 4.4BSD Hệ điều hành" bởi McKusick et. al. (Trang 369):

cơ sở quản lý

Bộ nhớ xoay quanh một cấu trúc dữ liệu gọi là mbuf. Mbufs hoặc bộ nhớ đệm, dài 128 byte, với 100 hoặc 108 byte của không gian này được dành riêng cho lưu trữ dữ liệu.

+0

Bạn có thể cung cấp một số chi tiết cụ thể hơn (chẳng hạn như cấu trúc dữ liệu hạt nhân được đề cập)? –

+0

@MichaelBurr trả lời chỉnh sửa với một số chi tiết. –

Các vấn đề liên quan