- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个关于共享内存的奇怪问题。
方法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:文件存在
。当我将第二个 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/
当我在Linux中使用函数shmget时,我真的很好奇标志IPC_EXCL的全名。我知道如果共享内存段已经存在,它与 IPC_CREAT 一起使用以确保失败。任何回复将不胜感激。 最佳答案 Hulk
我有一个关于共享内存的奇怪问题。 方法shmget 返回-1 并且errno 设置为EEXIST。根据 man 的说法,只有同时提供标志 IPC_EXCL 和 IPC_CREAT 才有可能。 我的代码
我是一名优秀的程序员,十分优秀!