首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shmget上不带IPC_EXCL的EEXIST

在shmget上不带IPC_EXCL的EEXIST
EN

Stack Overflow用户
提问于 2011-11-18 02:13:05
回答 1查看 3.7K关注 0票数 1

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

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

我的代码:

代码语言:javascript
复制
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: File exists。当我将第二个shmget更改为:

代码语言:javascript
复制
int shmid2 = shmget(0xABCD, MAX_SIZE, 0 );

引用自man shmget

代码语言:javascript
复制
EEXIST     IPC_CREAT | IPC_EXCL was specified and the segment exists. 

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-18 02:40:50

权限模式需要以八进制指定,而不是十六进制。0x660 (十六进制)= 03140 (八进制)。在Linux ABI中,IPC_EXCL标志的八进制值为02000 --因此,使用0x660而不是0660会意外地设置IPC_EXCL,这就是出现错误的原因。

如果我在您的程序中将0x660的两个实例都更改为0660,并修复其他使其无法编译的事情(值得注意的是,您省略了所有的头文件和MAX_SIZE的定义),它就会按预期工作。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8172174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档