2012-08-27 12 views
6

Linux上のプロジェクトのプロセス間でデータを共有するためにshmgetを使用しています。shmgetの鍵として使用する安全な値

int shmget(key_t key, size_t size, int shmflg); 

私はたshmgetを呼び出すためのキーとして定数を使用しているため、私はので、代わりに生成されたキーの定数を使用する必要があり、(ただし、他のプログラムがあまりにもたshmgetするために呼び出すことができ、ひいてはそれがキーの競合につながる可能性横方向のプロセスが構築され、別々に実行される)。

shmgetでキーとして使用する安全な値は何でしょうか?

答えて

5

私はあなたの代わりに、それはあまりにも長い間、あなたが他のソフトウェアと同じ名前の地域を使用していないようftokに存在する衝突の問題を持っていません(mmapで)POSIX shm_openを使用することをお勧め。

6

安全な値はなく、あなた(および共有セグメントを作成するすべてのプロセス)はIPC_EXCLを使用して衝突がないことを確認する必要があります。しかし、後者は、他のプログラムがあなたのセグメントに書き始めないようにしなければなりません(ひどく書かれていない限り)。

ftok()の「プライベート」キー定数を作成してみることはできますが、それは安全ではないことはわかっています。あなたが何かに衝突すると、プログラムに正しいキーではないことを伝える方法がありません。

idの下位8ビットのみが重要です。これらのビットが0の場合、ftok()の動作は不定です。

つまり、0をそこに渡さないでください。

いずれにしても、真剣にのコミュニケーションチャネルを作成することを検討してください。 idでサーバによって書き込まれた1つのファイルで十分であり、他のプログラムによって読み込まれます。

他の考え方では、サーバーPIDをidとして渡すことをお勧めします。これはそれを少し安全にすることができます。

+0

私はランダムキーを生成することを考えていて、受け入れ可能なキーが見つかるまでIPC_EXCLフラグを使ってshmセグメントを作成することを繰り返しますが、良いオプションかどうかわかりません。 – jondinham

+1

@PaulDinh:はい、それは良い選択です。まあ、特定の 'sizeof(key_t)'に頼ることなく、ランダムキーを生成する方法が必要です。私はちょうどftok()にランダムな 'id'を使っています。 –

+0

各クライアントがサーバとの効率的なIPCのために共有メモリセグメントを保持するクライアント - サーバのシナリオがある場合、一意の 'shmget()'キーの良い選択肢の1つは 'gettid()'システムコール呼び出し元のスレッドIDを返します。しかしこれはLinux固有のものです。 –

関連する問題