概要
C言語にて、実行ファイルが異なる場合のマルチプロセスでの排他を行ったときのメモ
コード
処理の流れ
- 共有メモリのkeyを作成
- 共有メモリを作成
- 共有メモリ上にmutexオブジェクトを作成
- 共有メモリ上のmutexでロック/アンロック
1. 共有メモリのkeyを作成
あまり気にしない場合、shmgetで使用する key は IPC_PRIVATE としていたが、マルチプロセスだとそれぞれで共有メモリを作成してしまう。
その状態だと、mutex作成後のforkではうまくいくが、実行ファイルが異なるとうまく排他できない。
そのため、shmget で key を指定することで、別の実行ファイルでも同じ共有メモリを使用できるようになる。
ftok は、存在するファイルパスと 0 以上の proj_id で key を作成してくれる。
2. 共有メモリを作成
作成した key を使い、shmget する。
IPC_CREAT | IPC_EXCL を指定すると、key に対する共有メモリが存在しない場合には作成し、すでに存在する場合はエラーとなる。
これによって、この後の初期化関連の処理をするかしないかを判断できる。
3. 共有メモリ上にmutexオブジェクトを作成
通常と変わらず、mutexオブジェクトを作成する。
4. 共有メモリ上のmutexでロック/アンロック
通常と同じく、必要な箇所でロック/アンロックする。
まとめ
- 実行ファイルが異なる場合には共有メモリの key を指定しなくてはならない。
- 実行ファイルが一つなら pthread_mutexattr_setpshared のみで大丈夫そう。
- IPC_PRIVATE が使える。
懸念点
- ftok が衝突する確率の確認