shm_open
マニュアルページから:
新しい共有メモリ オブジェクトは、最初は長さが 0 です。オブジェクトのサイズは、ftruncate(2) を使用して設定できます。[...] shm_open() 関数自体は、指定されたサイズの共有オブジェクトを作成しません。これを行うと、ファイル記述子によって参照されるオブジェクトのサイズを設定する既存の関数が複製されるためです。
これにより、アプリケーションが競合状態にさらされることはありませんか? 次の擬似コードを検討してください。
int fd = shm_open("/foo", CREATE);
if ( fd is valid ) {
// created shm object, so set its size
ftruncate(fd, 128);
} else {
fd = shm_open("/foo", GET_EXISTING);
}
void* mem = mmap(fd, 128);
shm_open
とのftruncate
呼び出しは (一緒に) アトミックではないため、あるプロセスが ( case ) を呼び出すが、 を呼び出す前に別のプロセスが ( case ) を呼び出してサイズ 0 のオブジェクトを試み、場合によってはそれに書き込もうとする競合状態が発生shm_open
するCREATE
可能ftruncate
性shm_open
がありますGET_EXISTING
。mmap
この競合状態を回避するには、次の 2 つの方法が考えられます。
IPCミューテックス/セマフォを使用して全体を同期させるか、または...
安全な場合 (POSIX に従って)、とケース
ftruncate
の両方を呼び出します。CREATE
GET_EXISTING
この競合状態を回避するための推奨される方法はどれですか?