gpt4 book ai didi

linux - shmget() 返回带有 IPC_CREAT 的 ENOENT

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:03 27 4
gpt4 key购买 nike

我正在使用 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() 中的错误还是我只是做错了什么。

有什么想法吗?

最佳答案

您的 if 语句未检查返回值 - 手册页说检查 shmid_ 是否为 -1,然后检查 errno。

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

您正在做的只是检查 errno - 它可能是在对其他函数的其他调用失败后的 ENOENT。

关于linux - shmget() 返回带有 IPC_CREAT 的 ENOENT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10645823/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com