6

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

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

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

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

4

2 に答える 2

6

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

ftok()から「秘密」鍵定数を作成してみることができますが、安全ではないことはご存知でしょう。何かと衝突した場合、これが正しいキーではないことをプログラムに伝える方法がありません。また、次のことも覚えておいてください。

の下位8ビットのみidが重要です。これらのビットが0の場合、ftok()の動作は指定されていません。

言い換えれば、0そこを通過しないでください;)。

いずれにせよ、コミュニケーションのチャネルを作成することを真剣に検討する必要があります。サーバーによってIDが書き込まれた単一のファイルで十分であり、それが他のプログラムによって読み取られます。

id他のアイデアから、他のプロセスが少なくともそれを取得できる場合は、サーバーPIDをとして渡すことを試みることができます。これにより、少し「安全」になる可能性があります。

于 2012-08-27T07:03:13.850 に答える
5

代わりにPOSIX shm_open(with )を使用することをお勧めします。他のソフトウェアと同じ名前の領域を使用していない限り、mmapとの衝突の問題はありません。ftok

于 2012-08-27T08:58:49.893 に答える