我正在使用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()
中的错误,还是我做错了。
有什么想法吗?
答案 0 :(得分:1)
你的if语句没有检查返回的值 - 手册页说检查shmid_为-1然后检查errno。
RETURN VALUE
A valid segment identifier, shmid, is returned on success, -1 on error.
你正在做的只是检查错误 - 在其他一些失败的其他函数调用之后它可能是ENOENT。