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 语句没有检查返回值 - 手册页说检查 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 回答