System V 共有メモリ IPC を使用するには、次の 2 つの関数を呼び出す必要があります。
int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
これらの引数を受け入れ、両方の機能を実行し、単にアドレスを返す単一の関数を持つのではなく、なぜそれらは別々に設計されているのでしょうか?
ファイルをアナロジーとして考えることができます。open
文字列 (ファイル パス) でファイル記述子を指定し、それを使用してファイルの読み取り/書き込みを行います。完了したら、ファイル記述子についてclose
説明します。この設計は自然に思えopen
ます。文字列を使用して記述子を取得し、次に記述子を取得する必要はありませんattach
。
私が考えていることの例として、FreeBSD sendmail 共有メモリーの実装を見てください。
この種の分離 (shm_open
およびmmap
) は POSIX 共有メモリにも存在しますが、その理由は、mmap
以前に存在していたものshm_open
が実装され、再利用できmmap
、記述子が必要だったからです (出典: UNIX Network Programming Vol. 2、R. Stevens、13 章、ページ326)。