プロセス間で共有されるミューテックスを作成するためにshmget()
使用する共有メモリセグメントを割り当てるために使用しています。pthread_mutex_init()
通常、これは期待どおりに機能します。ただし、ときどきshmget()
返されENOENT
ます。マニュアルページを読むと、これはがshmflg
含まれていない場合にのみ発生するはずですがIPC_CREAT
、私はそれを含めています。これが私のコードの一部です:
shmid_ = shmget( MYLOCK_KEY_ID, sizeof(pthread_mutex_t), IPC_CREAT | IPC_EXCL | 0666 );
if ( errno == ENOENT ) {
// This should never occur since IPC_CREAT was specified
std::cerr
<< "shmget() returned ENOENT (it thinks IPC_CREAT wasn't specified).\n"
<< "This seems to be a bug in shmget()?" << std::endl;
exit(1);
}
何が起こっているのか、私は完全に迷っています。これをいくつかのシステム(Linuxカーネル2.6.32および3.3.5)で試しましたが、どちらも同じ動作を示します。現在、この障害モードを取得すると、プロセスを繰り返すだけで、通常は機能します。しかし、それはちょっと厄介なようで、これがバグなのshmget()
か、それとも私が何か間違ったことをしているだけなのかはわかりません。
何か案は?