ftok

System V のIPCキーを取得するために便利な関数として、ftokがあるのだが。

key_t ftok(const char *pathname, int proj)

ファイル名とprojの値から一意のIPCキーを取得する、という建前の関数である。
ただし、この関数にはman pageにも書かれているとおり、衝突という問題がつきまとう。

ftok関数は通常ごくごくシンプルな実装であって、ざっと探して見つかるAndroidのソースではこのように実装されている。
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/stat.h>
key_t ftok(const char* path, int id)
{
struct stat st;

if ( lstat(path, &st) < 0 )
return -1;

return (key_t)( (st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16) | ((id & 255) << 24) );
}

当該ファイルのinodeの下位16ビットを使用しているに過ぎない。
これを十分と考えられる場合もあるし、そうではない場合もある。問題は衝突が許されない場合にどうするか。
  • 作成と取得処理を分ける必要がある。(重複チェックを行うため)
  • 作成したkeyを読み出し可能な方法で保存する必要がある。例えば、渡されたファイルの中に書き出すなど。
  • 毎度キーを読み出すのもアレなので、一度取得したキーはファイルアクセス無しに再取得できるように、内部テーブルにするなど。(通常1プロセスで使用するキーの量は数個あれば良いのでコスト的な問題にはならない)

とかいうことを考えて作り込む必要がある。
中~大規模なプロジェクトでは必須の処理と言える。(実際はキー値自体を定義させるようなシステムが業務系には多いんだが)

小規模なプロジェクトだったり、汎用性を求められない場合は、第2引数~上記のproj(ソース例ではid)~をうまく使う事で回避できる場合も多い。
0~255の区別さえつければ、少なくともそのプロジェクト内では一意性が保証される。(既に他のPPで使われているというケースもあるので完全にとは言えないが)

毛嫌いされる事も多いのだけれど、あれば便利な関数ということで、手軽に使いたい時には便利なので臆せず使っちゃおう。
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

f_yamaki

Author:f_yamaki

アクセスカウンタ
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク