9

ftok()Cアプリケーションで使用される共有メモリセグメントの識別子を生成するために使用しています。問題が発生しています。1つのボックスで、rootが使用する識別子との衝突が発生しています。この場合、コードをハッキングすることで修正できますが、より堅牢なソリューションが必要です。

アプリケーションは独自の論理ボリュームにインストールされ、ftokに提供されるパスは、アプリケーションのバイナリディレクトリ(そのlv内)です。提供されるIDは1から始まり、通常は5ダースほどあります。

私はftokが次のようなことをすることを追跡しました:

(id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff)

st.st_dev/st.st_inoの組み合わせは非常にユニークである必要があります。しかし、私はいくつかのボックスを見てきましたが、st_devの最下位ビットは多くの場合0です(つまり、st_devの数値は通常256の倍数です)。また、バイナリディレクトリは論理ボリューム内にあるため、iノード番号がrootが使用するものと異なるという保証はありません。

これを回避する良い方法はありますか?ftokのより良い代替手段、またはst_dev番号がftokにもっと役立つようにマシンを設定する方法はありますか?

4

2 に答える 2

8

shm_openこの種のキー衝突の影響を受けないPOSIX 共有メモリを (経由で) 使用することを検討することをお勧めします。

于 2011-09-07T12:07:29.483 に答える
1

アプリケーションは常にキーの衝突に対処できる必要があります。キーは、別の無関係なプロセスによって使用されている可能性があります。ただし、より関連性の高いビットを使用して、独自のバージョンの ftok() を作成することもできます。

理論的には、どのアプリケーションでも必要な「マスター」キーは 1 つだけで、他のキーが見つかる「スコアボード」を指します。ファイルシステムでマスターキーを公開することは良い考えかもしれません。クラッシュ後の再起動は常に問題になります。

于 2011-09-07T11:40:38.533 に答える