我有一个关于共享内存的奇怪问题。
方法shmget返回-1,errno设置为EEXIST。根据man,只有在同时提供标志IPC_EXCL和IPC_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: File exists。当我将第二个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),这是真的吗?
发布于 2011-11-18 02:40:50
权限模式需要以八进制指定,而不是十六进制。0x660 (十六进制)= 03140 (八进制)。在Linux ABI中,IPC_EXCL标志的八进制值为02000 --因此,使用0x660而不是0660会意外地设置IPC_EXCL,这就是出现错误的原因。
如果我在您的程序中将0x660的两个实例都更改为0660,并修复其他使其无法编译的事情(值得注意的是,您省略了所有的头文件和MAX_SIZE的定义),它就会按预期工作。
https://stackoverflow.com/questions/8172174
复制相似问题