3

誰かが(合理的に)null以外の2番目のパラメーターで関数shmat()を使用する例を提供できますか?

マニュアルには次のように書かれています。

#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);

shmat()関数は、共有メモリ識別子shmidに関連付けられた共有メモリセグメントを呼び出しプロセスのデータセグメントに接続します。セグメントは、次のいずれかの基準で指定されたアドレスに接続されます。

  • がNULLポインターの場合shmaddr、セグメントは、システムによって選択された最初の使用可能なアドレスに接続されます。
  • shmaddrがNULLポインターではなく、(shmflg&SHM_RND)がゼロ以外の場合、セグメントは(shmaddr-(shmaddr%SHMLBA))で指定されたアドレスに接続されます。
  • がNULLポインターではなく、(shmflg&SHM_RND)が0の場合shmaddr、セグメントはshmaddrで指定されたアドレスに接続されます。

しかし、shmaddrをNULLに設定した以外でshmatを使用した例は見たことがありません。私のプロジェクトでは、プロセスがそれをメモリに接続してmalloc()問題なく使用でき、別のプロセスがその共有メモリへのポインタを(shmidによって)取得し、メモリにアクセスしようとしたときにセグフォールトしました。

4

2 に答える 2

3

ここでの考え方は、共有セグメントを異なるプロセスの同じ仮想アドレスに配置して、共有メモリ内のアイテムをアドレス指定するためにプレーンポインタ(オフセットではない)を使用できるようにすることです。一般的なシナリオは、単一の「マスター」プロセスがカーネル提供のアドレス(2番目の引数ゼロ)にメモリをマップし、そのアドレスを帯域外チャネル(fork / execを使用したコマンド引数など)を介して「ワーカー」プロセスに伝達することです。、UNIXソケット、FIFOなど)、「ワーカー」はそのアドレスでセグメントをマッピングしようとします。繰り返しになりますが、カーネルが「マスター」の特定のVAで共有メモリをマップできた場合、「ワーカー」プロセスでも同じアドレスで問題ないはずです。

指摘すべき「合理的な」例はありません。Postgresが共有メモリでどのように機能するかを見ることができます。しかし、それは少し複雑です。

于 2010-02-09T13:41:05.097 に答える
0

絶対ポインタを含む構造を共有できるようにするためだと思います。

しかし、コードサンプルはありません。

于 2010-02-09T13:24:17.323 に答える