1

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)。

4

2 に答える 2

0

私が考えることができる1つの考えられる理由はこれです:( shmgetのマンページから)

  • fork(2) の後、子は接続された共有メモリ セグメントを継承します。
  • execve(2) の後、アタッチされたすべての共有メモリ セグメントがプロセスから切り離されます。
  • _exit(2) により、接続されているすべての共有メモリ セグメントがプロセスから切り離されます。

技術的には、アタッチとデタッチは、shmget 中に予約された共有メモリ セグメントでの基本的な参照カウントです。

shmget を介して共有メモリ セグメントを割り当てる機能と、それらをカウントする参照 (それぞれ shmat と shmdt を介してアップまたはダウン) は分離されているため、コードは fork と exec 中に再利用できます。

それらが両方とも同じ関数にパックされている場合は、とにかく、参照カウントを行うだけの別の関数が必要になります (fork/exec 中に呼び出される)。したがって、この設計は単にコードの再利用を促進し、コードの重複を避けるためのものだと思います。

于 2013-11-07T22:22:48.293 に答える