両方の呼び出しは、最新の Linux では本質的に同等です。最初のアプローチは、POSIX 共有メモリが存在しない go (https://github.com/fabiokung/shm/blob/master/shm_linux.go を参照) などの言語から POSIX 共有メモリにアクセスするために使用できます。ネイティブに利用可能 - 最初の呼び出しでファイルが作成されるか、/dev/shm が利用できない、および/またはパフォーマンスが低下する可能性がある他の OS/バージョンでは異なる場合があります。パスのマージのルールも librt のバージョンごとに進化している可能性があります
メモリ マップド ファイル API と呼ばれる最初のアプローチ (std ライブラリでサポート)
2 つ目は、POSIX 共有メモリ API と呼ばれます (依存関係として、Linux では librt 別名 libposix が必要です。内部でパスを構築し、open を呼び出します)
shm_open
のソースを読んだ後 、これら 2 つの方法はほとんど同じであると言えます。
リンク:https://code.woboq.org/userspace/glibc/sysdeps/posix/shm_open.c.html
shm_open は shm_dir プレフィックスを追加するだけで、通常の open
を呼び出します システムコール、特別なことは何もありません。
通常のファイルを開いて mmap() すると、データはそのファイルに格納されます。
追加の I/O オーバーヘッドが発生するデータを永続化する必要がなく、メモリ領域を共有する必要がある場合は、shm_open() を使用します。
このようなメモリ領域には、ミューテックスやセマフォなど、ほとんどのシステムで mmap() された通常のファイルに格納できない他の種類のオブジェクトを格納することもできます。