1

プロセス間で共有されるミューテックスを作成するために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()か、それとも私が何か間違ったことをしているだけなのかはわかりません。

何か案は?

4

1 に答える 1

1

ifステートメントが戻り値をチェックしていません-manページはshmid_で-1をチェックしてから、errnoをチェックすると言っています。

RETURN VALUE 
A valid segment identifier, shmid, is returned on success, -1 on error.

あなたがしているのは、errnoをチェックすることだけです-失敗した他の関数への他の呼び出しの後、それはENOENTである可能性があります。

于 2012-05-18T02:16:36.483 に答える