Unixシステムでは、通常、パス名に長さ制限はありません(Linuxでは4096文字)。長さ制限を持つソケットファイルパスは除外されます。約100文字(107文字Linux)。
- 最初の質問:限界はなぜこんなに低いのですか?
確認した結果、現在の作業ディレクトリを変更し、各ディレクトリで同じパスを使用して複数のソケットファイルを作成すると、この制限を解決できるようです。./myfile.sock
クライアントアプリケーションは、予想されるサーバープロセスに正しく接続されているようです。lsof
同じソケットファイルパス。
- このソリューションは信頼できますか?それとも幸運なのでしょうか?
- この動作はLinuxに固有のものですか、それともこの回避策は他のUnixにも当てはまりますか?
ベストアンサー1
snprintf()
と使用時のオーバーフローを防ぐために、他のプラットフォームとの互換性または以前のバージョンとの互換性strncpy()
。
マイケル・ケリスクが説明する彼の本存在するページ 1165- 57章、ソケット:Unixドメイン:
SUSv3 は sun_path フィールドのサイズを指定しません。初期のBSD実装では108バイトと104バイトを使用しましたが、最新の実装(HP-UX 11)では92バイトを使用しました。ポータブルアプリケーションはこの低い値でコーディングし、snprintf()またはstrncpy()を使用してこのフィールドに書き込むときにバッファオーバーフローを防ぐ必要があります。
Dockerの人々は一部のソケットの長さが110文字であるため、これを嘲笑することもあります。
これがLINUXが108個の文字ソケットを使用する理由です。これは変わりますか?確かに。これが、以前のオペレーティングシステムで最初にこの制限が作成された理由です。
答えを引用するには:
便利なカーネルデータ構造で使用可能なスペースを一致させることを目的としています。
McKusickらの「4.4BSDオペレーティングシステムの設計と実装」を引用してください。他。 (ページ369):
メモリ管理機能は、mbufs というデータ構造を中心に行われます。 Mbuf、つまりメモリバッファの長さは128バイトで、そのうち100または108バイトはデータ保存用に予約されています。
その他のオペレーティングシステム(Unixドメインソケット):
- オープンBSD:104文字
- FreeBSD:104文字
- Mac OS X 10.9:104文字