この多くは、歴史と将来の方向性に関係しています。
むかしむかし、unix には 2 つの主要な (そしてやや競合する) バージョン、つまりシステム V と BSD がありました。 SysV には、ビッグ 3 (共有メモリ、セマフォ、およびメッセージ キュー) を含む独自のバージョンの IPC がありました。 POSIX は物事を統合するために登場しました。
したがって、現在のところ、posix 共有メモリ、MQ、およびセマフォと sysV バージョンの 2 つのバージョンがあります。もう少し混乱させるために、sysV のバージョンも posix の一部です。
基本的にあなたの質問は、Posix または sysV スタイルの共有メモリを使用したいですか?一般に、ほとんどの人は長期的な視点から Posix を選択します。しかし、現実的には、sysV は非常に多くのシステムに組み込まれているため、それが消えることはないのではないかと真剣に疑う必要があります。
したがって、長期的なものを排除することは、あなたのプロジェクトとあなたの好みにとって何が理にかなっているのかということになります.一般に、sysV バージョンは実際にはいくらか強力になる傾向がありますが、最初の接触でほとんどの人が少し戸惑うと感じるぎこちないインターフェイスを備えています。これは、特に sysV セマフォとメッセージ キューに当てはまります。共有メモリに関しては、sysV と posix の両方が厄介であると主張できます。 sysV バージョンには不格好な ftok
が含まれています posixが複数の呼び出しといくつかの競合状態を設定することになる間、重要なもの。外部から見ると、posix バージョンには、ファイル システムを利用し、別のユーティリティ プログラム (例:ipcs
) sysV が必要とします。
では、どちらを使用する必要がありますか?原則として、posix バージョン。しかし、sysV のバージョンについてよく理解しておく必要があります。これらには、特定の状況で利用したい場合がある posix バージョンの機能を超える機能がいくつかあります。
どちらの方法も実行可能です。 mmap
メソッドは shmget
よりも少し制限的です 、しかし使いやすい。 shmget
は古い System V 共有メモリ モデルであり、最も広くサポートされています。 mmap
/shm_open
共有メモリを行うための新しい POSIX の方法であり、より使いやすくなっています。 OS で POSIX 共有メモリの使用が許可されている場合は、それを使用することをお勧めします。
いくつかのヒント:
fork
で子を作成する場合 次にmmap
MAP_ANONYMOUS | MAP_SHARED
で 1 回の呼び出しで、はるかに簡単な方法です。MAP_ANONYMOUS
ただし、POSIX で指定されていない Linux 拡張機能です。- プロセスを個別に開始するが、共有メモリ名を指定できる場合は
shm_open
(+ftruncate
) +mmap
MAP_SHARED
で 2/3 コールです。librt
が必要です 一部の OS では。 - お使いの OS が
/dev/shm/
の場合 次にshm_open
/dev/shm/
でファイルを開くのと同じです .