Filenames
為什麼套接字路徑長度限制為一百個字元?
在 Unix 系統上,路徑名通常幾乎沒有長度限制(在 Linux 上是 4096 個字元)…除了套接字文件路徑限制為大約 100 個字元(在Linux上為107 個字元)。
- 第一個問題:為什麼限制這麼低?
我已經檢查過似乎可以通過更改目前工作目錄並在各種目錄中創建多個使用相同路徑
./myfile.sock
的套接字文件來解決此限制:客戶端應用程序似乎正確連接到預期的伺服器程序,儘管lsof
顯示所有他們在同一個套接字文件路徑上監聽。
- 這種解決方法可靠還是我只是幸運?
- 這種行為是 Linux 特有的,還是這種解決方法也適用於其他 Unix?
與其他平台的兼容性,或與舊版本的兼容性,以避免在使用
snprintf()
和strncpy()
.Michael Kerrisk 在他的書中解釋了第 1165 頁- 第 57 章,套接字:Unix 域:
SUSv3 沒有指定 sun_path 欄位的大小。早期的 BSD 實現使用 108 和 104 字節,而一種現代實現 (HP-UX 11) 使用 92 字節。攜帶式應用程序應編碼為這個較低的值,並使用 snprintf() 或 strncpy() 以避免寫入此欄位時緩衝區溢出。
Docker 的人甚至取笑它,因為一些套接字有 110 個字元長:
這就是 LINUX 使用 108 字元套接字的原因。這可以改變嗎?當然。這就是為什麼首先在舊作業系統上創建此限制的原因:
引用答案:
這是為了匹配一個方便的核心資料結構中的可用空間。
引用 McKusick 等人的“4.4BSD 作業系統的設計和實現”。人。(第 369 頁):
> > 記憶體管理工具圍繞稱為 mbuf 的資料結構展開。Mbuf 或記憶體緩衝區的長度為 128 字節,其中 100 或 108 字節保留用於數據儲存。 > > >
其他作業系統(unix 域套接字):
- OpenBSD:104 個字元
- FreeBSD:104 個字元
- Mac OS X 10.9:104 個字元