我使用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()中的错误,或者我只是做错了什么。
有什么想法吗?
发布于 2012-05-18 10:16:36
您的if语句没有检查返回值-手册页显示检查-1的shmid_,然后检查errno。
RETURN VALUE
A valid segment identifier, shmid, is returned on success, -1 on error.您所做的只是检查errno -它可能是在对某个其他函数的调用失败后出现的ENOENT。
https://stackoverflow.com/questions/10645823
复制相似问题