shmget()返回带有IPC_CREAT的ENOENT

时间:2012-05-18 02:02:39

标签: linux memory pthreads mutex shared

我正在使用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)上尝试了这个,但两者都表现出相同的行为。目前,当我获得此故障模式时,我只是重复该过程,它通常有效。但这似乎是一种kludgey,我不知道这是shmget()中的错误,还是我做错了。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你的if语句没有检查返回的值 - 手册页说检查shmid_为-1然后检查errno。

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

你正在做的只是检查错误 - 在其他一些失败的其他函数调用之后它可能是ENOENT。