gpt4 book ai didi

linux - shmget 上没有 IPC_EXCL 的 EEXIST

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:41 24 4
gpt4 key购买 nike

我有一个关于共享内存的奇怪问题。

方法shmget 返回-1 并且errno 设置为EEXIST。根据 man 的说法,只有同时提供标志 IPC_EXCLIPC_CREAT 才有可能。

我的代码:

int main()
{
int shmid = shmget(0xABCD, MAX_SIZE, IPC_CREAT | 0x660);
int shmid2 = shmget(0xABCD, MAX_SIZE, IPC_CREAT | 0x660 );
if(shmid == -1)
{
if(errno == EEXIST)
perror("Error");
return -1;
}
if(shmid2 == -1)
{
if(errno == EEXIST)
perror("Error2");
return -1;
}
shmctl(shmid, IPC_RMID, NULL);
return 0;
}

它在没有警告的情况下使用 -Wall 编译,我检查 ipcs 段是否已经存在(并在需要时将其删除)。输出为 Error2:文件存在。当我将第二个 shmget 更改为:

int shmid2 = shmget(0xABCD, MAX_SIZE, 0 );

引自man shmget:

EEXIST     IPC_CREAT | IPC_EXCL was specified and the segment exists. 

还有一个问题:尝试执行 shmget 时没有使用 mode_flags(即 0x660)是真的吗?

最佳答案

权限模式需要指定为八进制,而不是十六进制。 0x660(十六进制)= 03140(八进制)。 IPC_EXCL 标志在 Linux ABI 中具有八进制值 02000——因此使用 0x660 而不是 0660您不小心设置了 IPC_EXCL,这就是您收到错误的原因。

如果我在你的程序中将 0x660 的两个实例都更改为 0660 并修复其他使其无法编译的东西(值得注意的是,你遗漏了所有标题和MAX_SIZE 的定义)它按预期工作。

关于linux - shmget 上没有 IPC_EXCL 的 EEXIST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172174/

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